您的位置:首页 > 其它

(完整!)2017-11-1 第七次 信息安全系统设计基础课 主要内容

2017-11-02 09:54 411 查看

第六次课考了一节课的试,什么也没讲,这篇随笔整理的是第七周老师上课讲的“线程”方面的内容

大家要是看过我以前的笔记整理博客,就应该能知道,


这个框框里的是老师的原话,


框框以外的是我对老师思路的解读,要是比较重要的地方我会写出重要!

有的
老师上课输入的代码
或者比较重要的代码我会写在这个小框框里面,

本次课老师讲的是第12章内容:并发编程。


我们今天讲的内容分为两个方面:

1.万能函数

2.多线程


其实今天的主要内容就是一个,老师以万能函数为例,并且以万能函数作为引入, 主要介绍多线程。


我们学习的东西可以用来应付考试,也可以用来应用实践,就像你英语学好了,你就多了一个“世界”,我们学习编程,最好能解决实际问题

并发在操作系统中很重要,原来万用表等等,很多的系统都不用并发, 现在万用表都用并发了。

有三种并发的实例:

1.程序间的并发:进程

2.函数级的并发:线程

3.(老师没讲但是我问了狄惟佳)I/O多路复用(当然不要求掌握)


老师现在先讲了一下程序间的并发,也就是进程并举例。


进程之间虚拟内存本来是隔离的,但是有IPC(Inter-Process Communication,进程间通信)可以实现进程间的通信,可以实现并发,但是函数之间没有这个协议,要是我想实现函数级的并发怎么办呢?


然后老师开始讲函数级并发了。


函数级并发我们将其称之为“线程”,函数之间的并发不是“谁调用谁”的问题了,

我们写程序时用的模块分为两个部分:

(等等,先提问一下什么是模块?答:一个.c就是一个模块)

(学任何编程语言都是这么一招,分模块来写)

1.接口

2.实现

接口用来指明函数做什么,而实现指明模块如何完成接口,一个接口可以有多个实现,接口是函数的调用者,实现是函数的实现者。



举例:如何写一个“求两个整数的和”的接口?要用c语言书写。


然后老师提示:只需要写参数返回值、而不能写在main里,写在main里就直接调用了,

然后老师写出了一种:


int sum(int 加数,int 被加数);return (加数+被加数);




其中
int sum(int 加数,int 被加数)
叫做函数的签名


老师扩展了一下知识:只要函数名相同,参数相同,类型相同,就算作同一个签名。


我们上面写的这个就算UNIX风格的写法,相同的,要是是这种写法:

(int sum ,int 加数,int 被加数,int *sum); *sum=加数+被加数


这种的就是POSIX风格的写法, 因为所有的输入输出都是参数搞定的。函数的返回值为0或1,只表示正确或者错误



好,现在大家写十种接口,不能重复。写出6种算合格,写完了拍照片发蓝墨云。



(大约尴尬了五分钟左右,老师开腔了)

十种可以怎么写啊?

数组可以吧?参数可以存放在数组里,

结构体也可以吧?

用一个指针、两个指针、三个指针都可以吧?

然后老师给给出了下面这张图,





注意:引入部分到此结束,接下来开始讲第一个内容:万能函数


所有函数都可以用结构体和指针代替,所以我们引出了万能函数,即
void *
就可以将接口转化为任意类型。



万能函数:

void *func (void *parameter); typedef void *(*uf) (void *para);


其中,(*uf)是万能函数的指针


啊注意,然后老师就开始讲多线程了!


什么是单线程?看下面这个例子:






提问:这个函数输出是什么?

某人答:print

追问:输出几个print?打了几遍?

某人答:一遍

旭哥:五遍

然后老师说:旭哥说的对啊,hello打了五遍,world打了五遍。(有个sleep(1),他的意思是每次执行完程序之后休眠1秒,所以打印十次,休眠十秒。)





但是如果把函数做成并发的话,hello和world的顺序就不好确定了。

有什么区别呢?

1.头文件变了,变成
include <pthread.h>


2.调用函数变成使用万能函数了。



提问:这个函数有几个线程?

答案:三个,因为两个pthread_creat和一个main,别忘了main也算一个线程。



使用pthread_join可以等待子进程全部执行完之后再结束。要是没等子进程执行完就结束的话程序就崩了。


然后老师输入
gcc -pthread hello_multi.c -o hp
将多线程的代码编译了一下:


time可以看程序的执行时间,输入
time ./hp
发现:两个程序并发了,即“你休眠我进行”,并发之后程序执行用了5s,这样就节省了时间。




然后老师用多线程对变量依次加一,共加了5000次,本来答案应该是1万,可是程序显示答案数值还不到6000,


为什么呢?哪里错了呢?

这就涉及到了“同步&互斥”问题。要用PV原理解决“同步&互斥”导致的资源不足问题。


接下来老师简单讲解了一下什么是同步,什么是互斥。


什么是互斥?同时刻只能有一个人使用。那什么是同步?同步显然是互斥的特例。

互斥问题和我们到商场存包很类似,存包的时候使用资源,存完包之后要释放资源给别人用,所以根据PV原理,先P一下把柜子锁起来,用完柜子之后V一下释放掉,给别人来用。



那刚刚那个问题怎么解决?

加了一个
pthread_mutex_unlock
函数,程序来了先锁一下,





之后是什么效果?之后就对了,答案变成1万了。互斥问题我们用“锁”解决,同步问题用“信号量”解决。



大家看一下书上的“读写模型”和“生产者&消费者”模型,然后做蓝墨云上的新练习。


~结束~

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: