操作系统(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被抽出,栈底为将要被淘汰的


浙公网安备 33010602011771号