08.进程控制

1.进程标识
  • 进程ID是唯一的,但也是可复用的,大部分系统采用延迟复用算法
  • ID为0的通常是调度进程,常被称为交换进程,是内核的一部分,不执行磁盘上的程序(所以也叫系统进程)
  • 进程ID为1的通常是init进程,自举过程由内核调用,超级用户特权运行,但是普通的用户进程,不会终止
#include <sys/types.h>
#include <unistd.h>

pid_t getpid(void);
pid_t getppid(void);
uid_t getuid(void);
uid_t geteuid(void);
gid_t getgid(void);
gid_t getegid(void);

2、fork()函数
#include <unistd.h>
pid_t fork(void);
  • 子进程返回0
  • 父进程返回子进程的进程ID
  • fork之后经常跟exec,所以采用了写时复制技术
  • 文件共享:
    • 打开的文件描述符的复制类似于执行了dup()
    • 父子进程共享同一文件偏移量
  • 父子进程的区别:
    • 子进程不继承文件锁
    • 子进程未处理的闹钟被清除
    • 子进程的未处理信号集设置为空集

3、vfork()
#include <sys/types.h>
#include <unistd.h>
pid_t vfork(void);

可移植的程序不应该使用这个函数

  • vfork()创建的子进程并不会完全复制父进程的地址空间,因为会马山调用exec
  • 子进程在调用exec()前在父进程空间中运行
  • vfork保证子进程先运行,子进程调用exec或exit后父进程才恢复运行

4、exit()
  • 进程有5中正常终止的方法:

    • main()中return
    • exit()
    • _[eE]xit
    • 最后一个线程执行return
    • 最后一个线程调用pthread_exit()
  • 进程的3中异常终止状态

    • 调用abort()
    • 接收到某些信号
    • 最后一个线程对"取消"作出响应
  • 父进程在子进程前终止,子进程编程僵尸进程

  • 子进程在父进程前终止,内核为子进程保存一定量的信息(包括进程ID,终止状态,CPU使用时间等)


5、wait()和waitpid()
#include <sys/types.h>
#include <sys/wait.h>

pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);
  • 进程终止时向父进程发送SIGCHLD信号
  • 调用wait时:
    • 子进程还活着则阻塞
    • 以终止则立即返回
    • 没有任何子进程则出错返回
  • 返回值指示退出状态、信号编号、是否产生core文件等
    WIFEXITED(status)
    WEXITSTATUS(status)
    WIFSIGNALED(status)
    WTERMSIG(status)
    WCOREDUMP(status)
    WIFSTOPPED(status)
    WSTOPSIG(status)
    WIFCONTINUED(status)
    

6、waitid()
int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options);
  • idtype
    • P_PID:等待特定进程
    • P_PGID:等待特定进程组中的任一子进程
    • P_ALL:等待任一子进程
  • options
    • WCONTINUED:等待一个进程,它以前曾被停止,此后又继续,但状态尚未报告
    • WEXITED:等待已退出的进程
    • WNOHANG:非阻塞
    • WNOWAIT:不破坏子进程的退出状态
    • WSTOPPED:进程已经停止,但状态尚未报告

7、wait3()和wait4()
#include <sys/types.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/wait.h>

pid_t wait3(int *status, int options,
            struct rusage *rusage);
pid_t wait4(pid_t pid, int *status, int options,
            struct rusage *rusage);
  • 允许内核返回由终止进程及其所有子进程使用的资源概况

8、竞争条件

多个进程企图对共享数据进行处理,结果取决于进程运行顺序

  • 为了避免竞争条件和轮询,进程间需要某种形式信号的发送和接收方法

9、exec()函数
#include <unistd.h>
extern char **environ;
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg,
            ..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[],
            char *const envp[]);
  • 进程调用exec函数时,进程执行的程序完全替换为新进程
  • 进程ID不变,因为只是用磁盘上的新程序替换了当前进程的正文段、数据段、堆栈
  • …(暂时用不到就不看了)

10、更改用户ID和更改组ID
int setuid(uid_t uid);
int setgid(gid_t gid);
  • 在linux中,特权以及访问控制是基于用户ID和组ID的
  • 更改用户ID规则
    • 若进程有root权限,实际/有效/保存的设置用户ID设置为uid
    • 。。。

11、解释器文件
  • 起始行是:
    #! pathname [optional-argument]
    

12、system()函数
int system(const char *command);
  • command为空时,可用时返回非0值
  • 返回值
    • -1:fork失败或waitpid返回EINTR之外的值
    • 127?:exec失败
    • shell的终止状态:成功

13、进程会计

启动进程会计后,每当进程结束内核就写一个会计记录:包括命令名、CPU时间总量、用户ID、组ID、启动时间内等

int acct(const char *filename);
  • 该函数用以启用和禁用进程会计,但至今没有一个标准做了声明,只有accton命令用了这个函数

14、用户标识

任一进程都可以得到实际用户ID和有效用户ID及组ID

#include <unistd.h>
char *getlogin(void);
int getlogin_r(char *buf, size_t bufsize);
#include <stdio.h>
char *cuserid(char *string);
  • 用以获取登录名

15、进程调度

16、进程时间
极化码(Polar Code)是由土耳其科学家Erdal Arıkan在2009年提出的一种新型纠错编码技术。它通过利用信道的极化现象,将虚拟信道分为误码率接近0和接近1/2的两类。在编码设计中,数据被放置在误码率极低的信道上,从而实现高效的数据传输。极化码的主要优势在于其理论编码容量能够达到香农限,并且构造方法较为简单。 MATLAB是一种功能强大的数学计算和编程工具,广泛应用于科学研究和工程领域。在极化码的研究中,MATLAB可用于构建编码和解码算法,模拟数据在不同信道条件下的传输效果,验证理论性能,并优化相关参数。 SC(Successive Cancellation,逐位取消)译码是极化码的基本解码方法。它从最可靠的比特开始,依次解码每个虚拟信道,且每个比特的解码结果会影响后续比特的解码,因为它们之间存在依赖关系。虽然SC译码的实现较为简单,但其计算复杂度较高,随着码长的增加,解码时间会线性增长。 SCL(Successive Cancellation List,逐位取消列表)译码是SC译码的改进版本。它通过引入列表机制,同时处理多个路径,从而增强了错误校正能力,并在一定程度上降低了错误率。与SC译码相比,SCL译码虽然需要消耗更多的计算资源,但能够提供更好的性能。 一个完整的MATLAB仿真资源通常包含以下内容: 编码模块:用于实现极化码的生成,包括码字构造和极化矩阵操作等。 信道模型:用于模拟各种通信信道,例如AWGN(加性高斯白噪声)信道或衰落信道。 SC/SCL译码模块:包含SC译码和SCL译码的算法实现。 误码率(BER)计算:通过比较发送和接收的码字,计算误码率,以评估编码性能。 性能曲线绘制:绘制误码率与信噪比(SNR)之间的关系曲线,展示不同译码策略的性能差异。 使用说明:指导用户如何运行仿真,理解代码结构,以及如何调整参数以进行自定义实验。 代码注
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值