os实验考前速成

又到了一年一度的期末考试阶段,每到了这个阶段,菜菜就会瑟瑟发抖,当然我也是其中的一个。一看标题,咦,OS实验,这不是实验课,还考试?
是的,你没有看错,在这门课有对应的理论课的情况下,这门课的考核方式不是大作业,而是考试!!!
那没辙啊,咱也不敢说什么,该复习复习喽,就一边复习一遍做了张思维导图,不过有一点要说明的是,因为后面时间来不及了,所以最后面的几个写的就比较的简略了,以后看看吧,有时间的话考虑补一下。

先放张图片吧

可能有点糊,刚好Xmind可以导出成markdown,我就导出丢在下面了,就是看着挺乱的,我把xmind格式的文件放在最下面了,有需要的可以自己下。下载好后,可以装个xmind,或者貌似wps也可以导入打开的,这就自己去尝试吧!

文件点这里!!密码是:osos

操作系统原理实验

进程的创建和管理

进程的创建

pid_t fork(void);

头文件
#include<unistd.h>
#include<sys/types.h>
子进程拥有父进程的
PC
CPU寄存器
打开文件
返回值
父进程中
  • 子进程PID
子进程中
ERROR
  • 负数
fork被调用一次,会返回两次结果
新进程创建完后,父子进程会调用下一条语句

获取进程标识号

pid_t getpid(void);

返回当前进程的PID

pid_t getppid(void);

返回当前进程父进程的PID

等待子进程终止

pid_t wait(int *status);

使父进程阻塞,知道子进程结束,如果没有子进程或子进程已经结束,会立刻返回
返回值
子进程的PID
Failure
  • -1
头文件
#include<sys/wait.h>
#include<sys/types.h>

终止进程

void exit(int status);

孤儿进程

父进程退出,子进程仍在运行

僵尸进程

进程创建一个子进程,if子进程退出,父进程仍没有通过wait或者waitpid获取子进程的状态信息,那么子进程的进程描述符仍保存在系统中

关键语句

pid _t pid

pid=fork()

Wait(0)

Exit(0)

If (pid==0){……}

头文件

#include<sys/types.h

#include<sys/wait.h>

线程的创建与管理

头文件

pthread.h

链接

-lpthread

操作

定义线程

pthread_t p1;

创建新线程

Int pthread_create(pthread_t *thread,const pthread_attr_t *attr,void (start_routine)(void *),void *arg)
参数
pthread_t *thread
  • 指向线程标识符的指针,返回线程的ID
const pthread_attr_t *attr
  • 用来设置线程属性,NULL表示使用默认属性
void (start_routine)(void *)
  • 线程运行函数的起始地址
Void *arg
  • 传给线程启动函数的参数
返回值
success
  • 0
failure
  • 错误码

线程终止

void pthread_exit(void *retval)
参数
retval
  • 进程退出状态,通常为NULL
返回值
返回一个指向某个对象的指针

进程等待

int pthread_join(pthread_t thread,void **retval)
说明
以阻塞的方式等待thread指定的线程结束
参数
thread
  • 线程标识符,ID
retval
  • 用户定义的指针,用来存储被等待线程的返回值
返回值
success
  • 0
failure
  • 错误号

互斥锁

互斥锁初始化
静态互斥锁
  • PTHREAD_MUTEX_INITALIZER
动态互斥锁
  • pthread_mutex_init
锁定
P操作
pthread_mutex_lock(&mutex)
释放
V操作
pthread_mutex_unlock(& mutex)

关键语句

fflush(stout)

强迫缓冲区内的数据写回

pthread_create(&t1,NULL,p_msg,(void*)”hello”)

pthread_create(&t2,NULL,p_msg,(void*)”world”)

pthread_join(t1,NULL)

pthread_join(t2,NULL)

pthread_mutex_t mutex;

定义互斥锁

pthread_mutex_init(&mutex,NULL)

初始化互斥量

pthread_mutex_lock(&mutex)

gnum++;sleep(1);gnum++;

Gnum++几次取决于MAX(i)-1

pthread_mutex_unlock(&mutex)

POSIX信号量

Linux信号量

内核信号量

用户态信号量

POSIX信号量
有名信号量
  • 值保存在文件中
无名信号量
  • 值保存在内存中
  • 无名信号量必须是多个进程(线程)的共享变量,无名信号量要保护的变量夜必须是多个进程(线程)的共享变量
SYSTEM V信号量

一种用于提供不同进程间或给定一个进程的不同线程间的同步手段的原语

头函数

semaphore.h

操作

信号量初始化

int sem_init(sem_t *sem,int shared,unsigned int value)
参数
sem_t *sem
  • 信号量变量
int pshared
  • 信号量类型
  • 0
    • 此信号量在相关进程间共享
  • else
    • 信号量只在当前进程的所有线程共享
unsigned int value
  • 指定信号量的初始值
返回值
success
  • 0
ERROR
  • -1,并把errno设置为合适的值

信号量减一操作

int sem_wait(sem_t *sem)
参数
等待信号量
返回值
success
  • 0
failure
  • -1

信号量加一操作

int sem_post(sem_t *sem)
说明
释放信号量,让信号量的值加一,若此时有sem_wait操作正在阻塞,则唤醒,相当于v操作

获取信号量的值

int sem_getvalue(sem_t *sem)

关键语句

#include<semaphore.h>

Sem_t sem_id

Sem_wait(&sem_id)

Sem_post(&sem_id)

Sem_init(&sem_id,0,1)

Sem_getvalue(&sem,&val)

信号

信号是一种异步通信的处理机制

分类

OS标准信号

用户进程自定义信号

信号和中断

相同点

相同的异步通信方式

不同点

中断有优先级,信号没有
信号处理程序在用户态下运行,中断处理程序在内核态下运行
中断响应及时,信号相应通常有很大的延迟

功能

发送信号

预置对信号的处理方式

收受信号的进程按事先规定完成对相应时间的处理

事件

信号注册

信号发送

信号处理

信号注销

不可靠信号量

1-31

可靠信号量

31-64

头函数

signal.h

操作

设置信号处理方式

方式一
void (signal(int signum,void( handler),void(* handler)(int)))(int)
signal()依照signum指定的信号编号来设置改信号的处理函数
信号到达时,会跳转到handler指定的函数执行
方式二
int sigaction(int signum,constituting sigaction *act,struct sigaction *oldact))
改变进程接受到特定信号后的行为

向任何进程或者进程组发送任何信号

kil(pid_t pid,int sig)
参数
pid
  • 信号发送对象
sig
  • 发送的信号值

新的发送信号系统调用

int sigqueue(pid_t pid,int sig,const union sigval Val
参数
pid
  • 接受信号的进程pid
sig
  • 确定即将发送的信号
val
  • 指定信号传递的参数

定时发送

unsigned int alarm(unsigned int seconds)

获取定时器状态

int getitimer(int which,struct itimerval *value)

设置定时器

int setitimer(int which,struct itimerval *value,struch itimerval *ovalue)

进程暂停知道信号出现

int pause(void)

向自身所在的进程发送一个信号

int raise(int signs)

关键语句

(Void)signal(SIGINT,SIG_DFL)

恢复SIGINT信号的处理操作

signal(SIGINT,ouch)

#include<signal.h>

Signal(SIGALRM,handler)

Alarm(3)

Struct itimerval value

Kill(getppid(0,SIGALRM)

Pause()

Setitimer(ITIMER_REAL,&value,&ovalue)

sigqueue(pid,sig,mysigval)

向本进程发送信号,并传递附加信息

sigemptyset(&act.sa_mask)

Carl-C 变为输出一条消息

共享内存

共享内存允许两个或多个进程共享一定的存储区域,是一种最快的IPC(进程通信)

头函数

sys/ipc.h

Sys/types.h

Sys/shm.h

操作

shmid=shmget(KEY,SIZE,IPC_CREATE|0600)

创建共享内存
返回
success
  • 共享内存标识符
ERROR
  • -1

shmaddr=(char*)shmat(shmid,NULL,0)

返回共享内存的起始地址

shmdt(shmaddr)

断开连接

shmctl(shmid,cmd,NULL)

cmd
IPC_STAT
  • 共享内存的状态
IPC_SET
  • 改变共享内存的状态
IPC_RMID
  • 删除共享内存
共享内存管理

信号量(system V)

头文件

sys/types.h

ipc.h

sem.h

操作

semget(key,users,sem flg)

新建,返回信号量集对象

semop(shmid,sops,sops)

PV操作

semctl(semis,semnum,cmd,arg)

信号量控制操作

消息队列

头函数

sys/types.h

sys/msg.h

sys/ipc.h

操作

msgget(key,msgfig)

创建

msgsnd(msgid,(void*)sone_date,SIZE,0)

发送消息到消息队列

msgrcv(msgid,(void*)sone_date,SIZE,typ,0)

从消息队列中读取消息

msgctl(msgid,IPC_STAT,&buf)

完成指定操作

管道

头函数

unistd.h

操作

建立管道

int pipe(int filedes[2])

read()

write()

本文同时发表在CSDN中,链接:https://blog.csdn.net/tangkcc/article/details/118460199

原文地址:https://www.cnblogs.com/tangkc/p/14968595.html