操作系统(Linux)
作者:互联网
@
目录补充
第四周
vfork
- 系统调用
vfork和它创建的子进程和父进程共享地址空间
fork创建独立的地址空间 - pid_t vfork(void)
共享包括栈空间 - 例
例2:栈错误,内存错误
exit(0); 终止进程,不返回
在进程当中运行新代码
- 替换进程映像
exec()
- 例
- system()函数
- 如果使用新映像完全取代,使用exec
- 例
‘新建进程system
加&变为后台进程
ps:查看进程信息
- 用exec执行命令
down没有被打印,本进程被已经被替换掉。
回收进程资源
- 两部分资源
- 回收用户空间资源
- return 和 exit区别
- exit 和 _exit区别
- 例
用return返回,循环会一直进行。
用exit返回,会终止当前进程 - 例2
exit刷新文件缓冲区
_exit不刷新文件缓冲区 - 注册退出函数
int atexit (void (*function)(void))
(1)先进后出:先注册的后执行
(2)等到exit(0)执行时执行才退出函数
(3)_exit不执行退出函数,return执行。
- 回收内核空间资源
waitpid:
第五周
同步机制--锁
- 同步互斥方法
- 关锁 lock 和开锁 unlock
关锁时忙等待,开销大。
非忙等(让权等待) -等待队列、阻塞-唤醒
饥饿、死锁
第七周
无名管道1
- 无名管道PIPE
“ | ” 为 管道
无亲缘关系不能使用无名管道 - 管道为内核中的一段特殊的内存空间
以文件的方式进行操作
- 管道和文件的区别
(1)无名管道的内核资源在通信两进程退出后会自动释放
(2)大小有限制,不能像文件那样存储大量常规信息
(3)不能使用lseek函数修改当前读写位置 - 创建无名管道
int pipe (int pipefd[2]);
单项操作
- 测试无名管道的大小
- 无名管道的读写
- 父子进程管道通信
Q:子进程关闭了读端,为什么还可以读写?
子进程继承父进程的所有资源,所以父子进程拥有各自独立的读写端。互不影响。
无名管道2
- 以阻塞的方式读无名管道,如果当前没有一个进程和写端关联,读操作立即返回,按如下操作
无论管道有无数据:
- 如果写端有关联,管道无数据,读进程会阻塞
- 以阻塞的方式写无名管道
signal :注册信号
没有进程读管道
- 以非阻塞的方式读写管道
写操作
灰色有数据,白色无数据
有名管道 FIFO
- 有名管道,命名管道
- 创建文件节点 mknod pipetest p
cat test.txt > pipetest& - 创建有名管道
pathname :必须系统中不存在
mode_t mod :权限
-l F后面多出红色 “ | ”,表示有名管道
echo:写入
cat:读出 - 读写有名管道
- 非亲缘关系进程使用有名管道通信
示例
- 管道的进本特点
双重模式
内核模式 用户模式
Linux
对已经释放的函数栈空间的访问,是非法的 访问,是不允许的。
系统调用
系统调用的 实现 --软中断,可编程中断
中断Interrupts
– 外部中断 External (hardware generated) interrupts 串口、硬盘、网卡、时钟、…
– 软件产生的中断 Software generated interrupts int 0x80指令,用于系统调用
• 异常Exceptions – 程序错误 – 软件产生的异常 – 机器检查出的异常
• 程序访问 – 通过高层次的API接口 – 而不是直接进行系统调用
• 三种最常用的应用程序编程接口(API)
– Win32 API 用于 Windows – POSIX API 用于 POSIX-based systems (包括UNIX LINUX,Mac OS X 的所有版本) – Java API 用于JAVA虚拟机(JVM)*
Linux 可执行文件结构
- BSS段: 全局或静态的未初始化的变量
- 数据段: 全局或静态的已初始化的变量
- 代码段:指令代码(操作码,操作数),常量, const声明的变量, 字符串常量
第八周
Linux 异步信号处理机制
-
软中断、异步机制
-
kill -l 查看所有信号值
-
向某一进程发送信号值
-
kill 进程 结束进程
-
信号的基本概念
(1)发送信号
(2)安装信号
(3)递送信号
(4)捕获信号
(5)屏蔽信号
(6)忽略信号
(7)未决信号
(8)可靠信号 不可靠信号
-
未决信号
存储在PCB中,存储在pending队列中
-
信号的生命周期
(2)信号被某个进程产生
kill 进程间
raise 自己发给自己
alarm 定时信号
信号的系统调用
- 发送信号
终端:CTRL C -- SIGINT
Shell 命令:kill -信号 pid
用户进程 -- 进程
内核 -- 进程 - kill 发送一个信号
向一个指定的进程发送信号,成功返回0,否则返回-1
- raise 自举一个信号
- alarm定时器
传参为0:取消之前的定时器
功能:
在usecs微秒后,将SIGALRM信号发送给进程,并且之后每隔interval微秒再发送一次SIGALRM信号。如果不对SIGALRM信号进程处理,默认操作是终止进程
延迟可能会因任何系统活动、处理调用所花费的时间或系统计时器的粒度而略微延长
参数:
usecs:第一次触发SIGALRM信号的时间
interval:第一次触发SIGALRM信号之后每隔interval微秒再触发一次SIGALRM信号,以微秒为单位
4.安装信号
sighandler_t signal(int signum, sighandler_t handler);
函数来说
signum 是信号的编号
handler 是中断函数的指针。信号处理函数的函数名
5.例1
例2
例3
pause(); 暂停执行,等待一个信号
等待信号
第九周
消息队列
- 消息队列的结构
消息队列的管理
- 创建队列
key 通信各方拥有相同key值
msgflag
例:
通过ftok创建key值 “.”代表当前路径
- 发送消息
消息队列ID 消息缓冲区指针 长度 flag
指针结构
默认:0 阻塞的方式 - 接收消息
- 发送成功
- 接收消息
- 消息队列属性
cmd
第十三周
页面置换算法--FIFO
- 算法过程
增加物理块(物理块增多,缺页次数增加情况--异常Belady's Anomaly)
异常原因:
最近最久未使用算法--LRU
- 算法过程
- LRU算法的可能实现方法
- 活动页面栈
7被抽出,栈底为将要被淘汰的
标签:操作系统,--,无名,管道,exit,信号,Linux,进程 来源: https://www.cnblogs.com/jsxz/p/14862628.html