0%

凯恩帝报表管理系统

数据库部分

创建数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
--创建数据库School Classroom Management Information System-SCMIS
create database KND
on primary
(
name='f1',
filename='D:\sqlserver\sqlwj\scmis\f1.mdf',
size=3mb,
maxsize=unlimited,
filegrowth=3%
),
(
name='f2',
filename='D:\sqlserver\sqlwj\scmis\f2.ndf',
size=10mb,
maxsize=500mb,
filegrowth=6mb
)
log on
(
name='f3',
filename='D:\sqlserver\sqlwj\scmis\f3.ldf',
size=1mb,
maxsize=unlimited,
filegrowth=2%
)

系统部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
--系统型号
create table 系统型号
(
型号 varchar(30) not null
)
--NC软件版本
create table NC软件版本
(
型号 varchar(30) not null
)
--PLC软件版本
create table PLC软件版本
(
型号 varchar(30) not null default '标准PLC'
)
--指令脉冲
create table 指令脉冲
(
型号 varchar(5) not null default '无'
)
--刀架上拉电阻
create table 刀架上拉电阻
(
型号 varchar(5) not null default '无'
)
--电源单元
create table 电源单元
(
型号 varchar(30) not null
)
--配套资料
create table 配套资料
(
型号 varchar(5) not null default '有'
)
--NC面板
create table NC面板
(
型号 varchar(5) not null default '有'
)

驱动部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
--驱动部分
--X轴驱动
create table X轴驱动
(
型号 varchar(30) not null
)
--X轴电机
create table X轴电机
(
型号 varchar(30) not null
)
--Y轴驱动
create table Y轴驱动
(
型号 varchar(30) not null
)
--Y轴电机
create table Y轴电机
(
型号 varchar(30) not null
)
--Z轴驱动
create table Z轴驱动
(
型号 varchar(30) not null
)
--Z轴电机
create table Z轴电机
(
型号 varchar(30) not null
)
--主轴驱动1
create table 主轴驱动1
(
型号 varchar(30) not null
)
--主轴电机1
create table 主轴电机1
(
型号 varchar(30) not null
)

选择件部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
--选择件部分
--附加面板
create table 附加面板
(
型号 varchar(30) not null
)
--隔离变压器
create table 隔离变压器
(
型号 varchar(30) not null
)
--外置手轮
create table 外置手轮
(
型号 varchar(30) not null
)
--制动电阻
create table 制动电阻
(
型号 varchar(30) not null
)
--IO模块
create table IO模块
(
型号 varchar(30) not null
)
--资料
create table 资料
(
型号 varchar(30) not null
)

电缆

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
--系统电缆
--以太网
create table 以太网
(
电缆工艺图 varchar(30) ,
数量 Integer ,
长度 varchar(10),
对接产品 varchar(30)
)
--电源线
create table 电源线
(
电缆工艺图 varchar(30) ,
数量 Integer ,
长度 varchar(10),
对接产品 varchar(30)
)
--系统电缆_附加面板
create table 系统电缆_附加面板
(
电缆工艺图 varchar(30) ,
数量 Integer ,
长度 varchar(10),
对接产品 varchar(30)
)
--外置手轮电缆
create table 外置手轮电缆
(
电缆工艺图 varchar(30) ,
数量 Integer ,
长度 varchar(10),
对接产品 varchar(30)
)

--伺服总线电缆_X轴
create table 伺服总线电缆_X轴
(
电缆工艺图 varchar(30) ,
数量 Integer ,
长度 varchar(10),
对接产品 varchar(30)
)
--伺服总线电缆_Y轴
create table 伺服总线电缆_Y轴
(
电缆工艺图 varchar(30) ,
数量 Integer ,
长度 varchar(10),
对接产品 varchar(30)
)
--伺服总线电缆_Z轴
create table 伺服总线电缆_Z轴
(
电缆工艺图 varchar(30) ,
数量 Integer ,
长度 varchar(10),
对接产品 varchar(30)
)

--动力电缆_X轴
create table 动力电缆_X轴
(
电缆工艺图 varchar(30) ,
数量 Integer ,
长度 varchar(10),
对接产品 varchar(30)
)
--动力电缆_Y轴
create table 动力电缆_Y轴
(
电缆工艺图 varchar(30) ,
数量 Integer ,
长度 varchar(10),
对接产品 varchar(30)
)
--动力电缆_Z轴
create table 动力电缆_Z轴
(
电缆工艺图 varchar(30) ,
数量 Integer ,
长度 varchar(10),
对接产品 varchar(30)
)

--反馈电缆_X轴
create table 反馈电缆_X轴
(
电缆工艺图 varchar(30) ,
数量 Integer ,
长度 varchar(10),
对接产品 varchar(30)
)
--反馈电缆_Y轴
create table 反馈电缆_Y轴
(
电缆工艺图 varchar(30) ,
数量 Integer ,
长度 varchar(10),
对接产品 varchar(30)
)
--反馈电缆_Z轴
create table 反馈电缆_Z轴
(
电缆工艺图 varchar(30) ,
数量 Integer ,
长度 varchar(10),
对接产品 varchar(30)
)

--电力电缆_X轴
create table 电力电缆_X轴
(
电缆工艺图 varchar(30) ,
数量 Integer ,
长度 varchar(10),
对接产品 varchar(30)
)
--电力电缆_Y轴
create table 电力电缆_Y轴
(
电缆工艺图 varchar(30) ,
数量 Integer ,
长度 varchar(10),
对接产品 varchar(30)
)
--电力电缆_Z轴
create table 电力电缆_Z轴
(
电缆工艺图 varchar(30) ,
数量 Integer ,
长度 varchar(10),
对接产品 varchar(30)
)

--制动电缆_X轴
create table 制动电缆_X轴
(
电缆工艺图 varchar(30) ,
数量 Integer ,
长度 varchar(10),
对接产品 varchar(30)
)
--制动电缆_Y轴
create table 制动电缆_Y轴
(
电缆工艺图 varchar(30) ,
数量 Integer ,
长度 varchar(10),
对接产品 varchar(30)
)
--制动电缆_Z轴
create table 制动电缆_Z轴
(
电缆工艺图 varchar(30) ,
数量 Integer ,
长度 varchar(10),
对接产品 varchar(30)
)

--抱闸信号电缆_X轴
create table 抱闸信号电缆_X轴
(
电缆工艺图 varchar(30) ,
数量 Integer ,
长度 varchar(10),
对接产品 varchar(30)
)
--抱闸信号电缆_Y轴
create table 抱闸信号电缆_Y轴
(
电缆工艺图 varchar(30) ,
数量 Integer ,
长度 varchar(10),
对接产品 varchar(30)
)
--抱闸信号电缆_Z轴
create table 抱闸信号电缆_Z轴
(
电缆工艺图 varchar(30) ,
数量 Integer ,
长度 varchar(10),
对接产品 varchar(30)
)

--主轴1电缆_伺服总线电缆
create table 主轴1电缆_伺服总线电缆
(
电缆工艺图 varchar(30) ,
数量 Integer ,
长度 varchar(10),
对接产品 varchar(30)
)
--主轴1电缆_主轴动力电缆
create table 主轴1电缆_主轴动力电缆
(
电缆工艺图 varchar(30) ,
数量 Integer ,
长度 varchar(10),
对接产品 varchar(30)
)
--主轴1电缆_主轴反馈电缆
create table 主轴1电缆_主轴反馈电缆
(
电缆工艺图 varchar(30) ,
数量 Integer ,
长度 varchar(10),
对接产品 varchar(30)
)
--主轴1电缆_主轴电力电缆
create table 主轴1电缆_主轴电力电缆
(
电缆工艺图 varchar(30) ,
数量 Integer ,
长度 varchar(10),
对接产品 varchar(30)
)
--主轴1电缆_风机电缆
create table 主轴1电缆_风机电缆
(
电缆工艺图 varchar(30) ,
数量 Integer ,
长度 varchar(10),
对接产品 varchar(30)
)
--主轴1电缆_制动电阻电缆
create table 主轴1电缆_制动电阻电缆
(
电缆工艺图 varchar(30) ,
数量 Integer ,
长度 varchar(10),
对接产品 varchar(30)
)
--主轴1电缆_主轴编码器电缆
create table 主轴1电缆_主轴编码器电缆
(
电缆工艺图 varchar(30) ,
数量 Integer ,
长度 varchar(10),
对接产品 varchar(30)
)

插入一些基础值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
use KND
--插入默认值
--系统部分
insert into 系统型号
values('K2000TF3i')
insert into NC软件版本
values('KTF_A01_V5.2.00c')
insert into PLC软件版本
values('标准PLC')
insert into 指令脉冲
values('无')
insert into 刀架上拉电阻
values('无')
insert into 电源单元
values('LRS-75-24')
insert into 配套资料
values('有')
insert into NC面板
values('有')

--驱动部分
insert into X轴驱动
values('SD310-75(I)')
insert into X轴电机
values('KA180-M18615 M6Z')
insert into Y轴驱动
values('ZD210A-45P5E3')
insert into Y轴电机
values('KD180-M28420 M')
insert into Z轴驱动
values('SD310-75(I)')
insert into Z轴电机
values('KA180-M18615 M6')
insert into 主轴驱动1
values('ZD210-4022E5')
insert into 主轴电机1
values('ZJY-160A-15-1000F3')

--选择件部分
insert into 选择器部分_附加面板
values('J028K-0500-153001')
insert into 隔离变压器
values('5KVA')
insert into 外置手轮
values('HT-941-100-GC')
insert into 制动电阻
values('1600W/40R-铝壳')
insert into IO模块
values('SD6')
insert into 资料
values('用户手册')


--系统电缆
insert into 以太网
values('32006','1','3','')
insert into 电源线
values('010xx-xxxx','1','标配','LRS-75-24')
insert into 系统电缆_附加面板
values('31xxx-xxxx','1','标配','J028K-0500-153001')
insert into 外置手轮电缆
values('33009','1','标配','HT-941-100-GC')
--伺服总线电缆
insert into 伺服总线电缆_X轴
values('32203-1022.01','1','6','')
insert into 伺服总线电缆_Y轴
values('32203-1022.01','1','0.8','')
insert into 伺服总线电缆_Z轴
values('32203-1022.01','1','0.8','')
--动力电缆
insert into 动力电缆_X轴
values('20313-4040.01','1','6','KA180-M18615 M6Z')
insert into 动力电缆_Y轴
values('20313-4040','1','6','KD180-M28420 M')
insert into 动力电缆_Z轴
values('20313-4040.01','1','6','KA180-M18615 M6')
--反馈电缆
insert into 反馈电缆_X轴
values('21503-1082.01','1','6','KA180-M18615 M6Z')
insert into 反馈电缆_Y轴
values('21702.01-1082','1','6','KD180-M28420 M')
insert into 反馈电缆_Z轴
values('21503-1082.01','1','6','KA180-M18615 M6')
--电力电缆
insert into 电力电缆_X轴
values('22203-3025','1','2','KA180-M18615 M6Z')
insert into 电力电缆_Y轴
values('72003.02-3025','1','2','KD180-M28420 M')
insert into 电力电缆_Z轴
values('22203-3025','1','2','KA180-M18615 M6')
--制动电缆
insert into 制动电缆_X轴
values('23002-2021.01','1','6','KA180-M18615 M6Z')
insert into 制动电缆_Y轴
values('','','','KD180-M28420 M')
insert into 制动电缆_Z轴
values('','','','KA180-M18615 M6')
--抱闸信号电缆
insert into 抱闸信号电缆_X轴
values('24002-2021.01','1','2','KA180-M18615 M6Z')
insert into 抱闸信号电缆_Y轴
values('','','','KD180-M28420 M')
insert into 抱闸信号电缆_Z轴
values('','','','KA180-M18615 M6')
--主轴1电缆
insert into 主轴1电缆_伺服总线电缆
values('32203-1022.01','1','2','')
insert into 主轴1电缆_主轴动力电缆
values('70005.02-4060','1','6','ZJY-160A-15-1000F3')
insert into 主轴1电缆_主轴反馈电缆
values('71831-1081','1','6','ZJY-160A-15-1000F3')
insert into 主轴1电缆_主轴电力电缆
values('72005.01-3060','1','3','ZJY-160A-15-1000F3')
insert into 主轴1电缆_风机电缆
values('73001-3010','1','6','')
insert into 主轴1电缆_制动电阻电缆
values('74005-RV6','1','标配','1600W/40R-铝壳')
insert into 主轴1电缆_主轴编码器电缆
values('75006-1081.01','1','6','')

创建约束

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
use KND
create table 约束
(
系统型号 varchar(30) not null ,
NC软件版本 varchar(30) not null,
PLC软件版本 varchar(30) not null default '标准PLC',
指令脉冲 varchar(5) not null default '无',
刀架上拉电阻 varchar(5) not null default '无',
电源单元 varchar(30) not null ,
配套资料 varchar(5) not null default '有',
NC面板 varchar(5) not null default '有',
X轴驱动 varchar(30) not null,
X轴电机 varchar(30) not null,
Y轴驱动 varchar(30) not null,
Y轴电机 varchar(30) not null,
Z轴驱动 varchar(30) not null,
Z轴电机 varchar(30) not null ,
主轴驱动1 varchar(30) not null ,
主轴电机1 varchar(30) not null,
附加面板 varchar(30) not null,
隔离变压器 varchar(30) not null,
外置手轮 varchar(30) not null,
制动电阻 varchar(30) not null,
IO模块 varchar(30) not null,
资料 varchar(30) not null ,
以太网电缆工艺图 varchar(30) ,
以太网数量 Integer ,
以太网长度 varchar(10),
以太网对接产品 varchar(30),
电源线电缆工艺图 varchar(30) ,
电源线数量 Integer ,
电源线长度 varchar(10),
电源线对接产品 varchar(30),
系统电缆_附加面板电缆工艺图 varchar(30) ,
系统电缆_附加面板数量 Integer ,
系统电缆_附加面板长度 varchar(10),
系统电缆_附加面板对接产品 varchar(30),
外置手轮电缆电缆工艺图 varchar(30) ,
外置手轮电缆数量 Integer ,
外置手轮电缆长度 varchar(10),
外置手轮电缆对接产品 varchar(30),
伺服总线电缆_X轴电缆工艺图 varchar(30) ,
伺服总线电缆_X轴数量 Integer ,
伺服总线电缆_X轴长度 varchar(10),
伺服总线电缆_X轴对接产品 varchar(30),

伺服总线电缆_Y轴电缆工艺图 varchar(30) ,
伺服总线电缆_Y轴数量 Integer ,
伺服总线电缆_Y轴长度 varchar(10),
伺服总线电缆_Y轴对接产品 varchar(30),

伺服总线电缆_Z轴电缆工艺图 varchar(30) ,
伺服总线电缆_Z轴数量 Integer ,
伺服总线电缆_Z轴长度 varchar(10),
伺服总线电缆_Z轴对接产品 varchar(30),

动力电缆_X轴电缆工艺图 varchar(30) ,
动力电缆_X轴数量 Integer ,
动力电缆_X轴长度 varchar(10),
动力电缆_X轴对接产品 varchar(30),

动力电缆_Y轴电缆工艺图 varchar(30) ,
动力电缆_Y轴数量 Integer ,
动力电缆_Y轴长度 varchar(10),
动力电缆_Y轴对接产品 varchar(30),

动力电缆_Z轴电缆工艺图 varchar(30) ,
动力电缆_Z轴数量 Integer ,
动力电缆_Z轴长度 varchar(10),
动力电缆_Z轴对接产品 varchar(30),

反馈电缆_X轴电缆工艺图 varchar(30) ,
反馈电缆_X轴数量 Integer ,
反馈电缆_X轴长度 varchar(10),
反馈电缆_X轴对接产品 varchar(30),

反馈电缆_Y轴电缆工艺图 varchar(30) ,
反馈电缆_Y轴数量 Integer ,
反馈电缆_Y轴长度 varchar(10),
反馈电缆_Y轴对接产品 varchar(30),

反馈电缆_Z轴电缆工艺图 varchar(30) ,
反馈电缆_Z轴数量 Integer ,
反馈电缆_Z轴长度 varchar(10),
反馈电缆_Z轴对接产品 varchar(30),

电力电缆_X轴电缆工艺图 varchar(30) ,
电力电缆_X轴数量 Integer ,
电力电缆_X轴长度 varchar(10),
电力电缆_X轴对接产品 varchar(30),

电力电缆_Y轴电缆工艺图 varchar(30) ,
电力电缆_Y轴数量 Integer ,
电力电缆_Y轴长度 varchar(10),
电力电缆_Y轴对接产品 varchar(30),

电力电缆_Z轴电缆工艺图 varchar(30) ,
电力电缆_Z轴数量 Integer ,
电力电缆_Z轴长度 varchar(10),
电力电缆_Z轴对接产品 varchar(30),

制动电缆_X轴电缆工艺图 varchar(30) ,
制动电缆_X轴数量 Integer ,
制动电缆_X轴长度 varchar(10),
制动电缆_X轴对接产品 varchar(30),

制动电缆_Y轴电缆工艺图 varchar(30) ,
制动电缆_Y轴数量 Integer ,
制动电缆_Y轴长度 varchar(10),
制动电缆_Y轴对接产品 varchar(30),

制动电缆_Z轴电缆工艺图 varchar(30) ,
制动电缆_Z轴数量 Integer ,
制动电缆_Z轴长度 varchar(10),
制动电缆_Z轴对接产品 varchar(30),

抱闸信号电缆_X轴电缆工艺图 varchar(30) ,
抱闸信号电缆_X轴数量 Integer ,
抱闸信号电缆_X轴长度 varchar(10),
抱闸信号电缆_X轴对接产品 varchar(30),

抱闸信号电缆_Y轴电缆工艺图 varchar(30) ,
抱闸信号电缆_Y轴数量 Integer ,
抱闸信号电缆_Y轴长度 varchar(10),
抱闸信号电缆_Y轴对接产品 varchar(30),

抱闸信号电缆_Z轴电缆工艺图 varchar(30) ,
抱闸信号电缆_Z轴数量 Integer ,
抱闸信号电缆_Z轴长度 varchar(10),
抱闸信号电缆_Z轴对接产品 varchar(30),

主轴1电缆_伺服总线电缆电缆工艺图 varchar(30) ,
主轴1电缆_伺服总线电缆数量 Integer ,
主轴1电缆_伺服总线电缆长度 varchar(10),
主轴1电缆_伺服总线电缆对接产品 varchar(30),

主轴1电缆_主轴动力电缆电缆工艺图 varchar(30) ,
主轴1电缆_主轴动力电缆数量 Integer ,
主轴1电缆_主轴动力电缆长度 varchar(10),
主轴1电缆_主轴动力电缆对接产品 varchar(30),

主轴1电缆_主轴反馈电缆电缆工艺图 varchar(30) ,
主轴1电缆_主轴反馈电缆数量 Integer ,
主轴1电缆_主轴反馈电缆长度 varchar(10),
主轴1电缆_主轴反馈电缆对接产品 varchar(30),

主轴1电缆_主轴电力电缆电缆工艺图 varchar(30) ,
主轴1电缆_主轴电力电缆数量 Integer ,
主轴1电缆_主轴电力电缆长度 varchar(10),
主轴1电缆_主轴电力电缆对接产品 varchar(30),

主轴1电缆_风机电缆电缆工艺图 varchar(30) ,
主轴1电缆_风机电缆数量 Integer ,
主轴1电缆_风机电缆长度 varchar(10),
主轴1电缆_风机电缆对接产品 varchar(30),

主轴1电缆_制动电阻电缆电缆工艺图 varchar(30) ,
主轴1电缆_制动电阻电缆数量 Integer ,
主轴1电缆_制动电阻电缆长度 varchar(10),
主轴1电缆_制动电阻电缆对接产品 varchar(30),

主轴1电缆_主轴编码器电缆电缆工艺图 varchar(30) ,
主轴1电缆_主轴编码器电缆数量 Integer ,
主轴1电缆_主轴编码器电缆长度 varchar(10),
主轴1电缆_主轴编码器电缆对接产品 varchar(30),
)

创建记录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
use KND
create table 记录
(
系统型号 varchar(30) not null ,
NC软件版本 varchar(30) not null,
PLC软件版本 varchar(30) not null default '标准PLC',
指令脉冲 varchar(5) not null default '无',
刀架上拉电阻 varchar(5) not null default '无',
电源单元 varchar(30) not null ,
配套资料 varchar(5) not null default '有',
NC面板 varchar(5) not null default '有',
X轴驱动 varchar(30) not null,
X轴电机 varchar(30) not null,
Y轴驱动 varchar(30) not null,
Y轴电机 varchar(30) not null,
Z轴驱动 varchar(30) not null,
Z轴电机 varchar(30) not null ,
主轴驱动1 varchar(30) not null ,
主轴电机1 varchar(30) not null,
附加面板 varchar(30) not null,
隔离变压器 varchar(30) not null,
外置手轮 varchar(30) not null,
制动电阻 varchar(30) not null,
IO模块 varchar(30) not null,
资料 varchar(30) not null ,
以太网电缆工艺图 varchar(30) ,
以太网数量 Integer ,
以太网长度 varchar(10),
以太网对接产品 varchar(30),
电源线电缆工艺图 varchar(30) ,
电源线数量 Integer ,
电源线长度 varchar(10),
电源线对接产品 varchar(30),
系统电缆_附加面板电缆工艺图 varchar(30) ,
系统电缆_附加面板数量 Integer ,
系统电缆_附加面板长度 varchar(10),
系统电缆_附加面板对接产品 varchar(30),
外置手轮电缆电缆工艺图 varchar(30) ,
外置手轮电缆数量 Integer ,
外置手轮电缆长度 varchar(10),
外置手轮电缆对接产品 varchar(30),
伺服总线电缆_X轴电缆工艺图 varchar(30) ,
伺服总线电缆_X轴数量 Integer ,
伺服总线电缆_X轴长度 varchar(10),
伺服总线电缆_X轴对接产品 varchar(30),

伺服总线电缆_Y轴电缆工艺图 varchar(30) ,
伺服总线电缆_Y轴数量 Integer ,
伺服总线电缆_Y轴长度 varchar(10),
伺服总线电缆_Y轴对接产品 varchar(30),

伺服总线电缆_Z轴电缆工艺图 varchar(30) ,
伺服总线电缆_Z轴数量 Integer ,
伺服总线电缆_Z轴长度 varchar(10),
伺服总线电缆_Z轴对接产品 varchar(30),

动力电缆_X轴电缆工艺图 varchar(30) ,
动力电缆_X轴数量 Integer ,
动力电缆_X轴长度 varchar(10),
动力电缆_X轴对接产品 varchar(30),

动力电缆_Y轴电缆工艺图 varchar(30) ,
动力电缆_Y轴数量 Integer ,
动力电缆_Y轴长度 varchar(10),
动力电缆_Y轴对接产品 varchar(30),

动力电缆_Z轴电缆工艺图 varchar(30) ,
动力电缆_Z轴数量 Integer ,
动力电缆_Z轴长度 varchar(10),
动力电缆_Z轴对接产品 varchar(30),

反馈电缆_X轴电缆工艺图 varchar(30) ,
反馈电缆_X轴数量 Integer ,
反馈电缆_X轴长度 varchar(10),
反馈电缆_X轴对接产品 varchar(30),

反馈电缆_Y轴电缆工艺图 varchar(30) ,
反馈电缆_Y轴数量 Integer ,
反馈电缆_Y轴长度 varchar(10),
反馈电缆_Y轴对接产品 varchar(30),

反馈电缆_Z轴电缆工艺图 varchar(30) ,
反馈电缆_Z轴数量 Integer ,
反馈电缆_Z轴长度 varchar(10),
反馈电缆_Z轴对接产品 varchar(30),

电力电缆_X轴电缆工艺图 varchar(30) ,
电力电缆_X轴数量 Integer ,
电力电缆_X轴长度 varchar(10),
电力电缆_X轴对接产品 varchar(30),

电力电缆_Y轴电缆工艺图 varchar(30) ,
电力电缆_Y轴数量 Integer ,
电力电缆_Y轴长度 varchar(10),
电力电缆_Y轴对接产品 varchar(30),

电力电缆_Z轴电缆工艺图 varchar(30) ,
电力电缆_Z轴数量 Integer ,
电力电缆_Z轴长度 varchar(10),
电力电缆_Z轴对接产品 varchar(30),

制动电缆_X轴电缆工艺图 varchar(30) ,
制动电缆_X轴数量 Integer ,
制动电缆_X轴长度 varchar(10),
制动电缆_X轴对接产品 varchar(30),

制动电缆_Y轴电缆工艺图 varchar(30) ,
制动电缆_Y轴数量 Integer ,
制动电缆_Y轴长度 varchar(10),
制动电缆_Y轴对接产品 varchar(30),

制动电缆_Z轴电缆工艺图 varchar(30) ,
制动电缆_Z轴数量 Integer ,
制动电缆_Z轴长度 varchar(10),
制动电缆_Z轴对接产品 varchar(30),

抱闸信号电缆_X轴电缆工艺图 varchar(30) ,
抱闸信号电缆_X轴数量 Integer ,
抱闸信号电缆_X轴长度 varchar(10),
抱闸信号电缆_X轴对接产品 varchar(30),

抱闸信号电缆_Y轴电缆工艺图 varchar(30) ,
抱闸信号电缆_Y轴数量 Integer ,
抱闸信号电缆_Y轴长度 varchar(10),
抱闸信号电缆_Y轴对接产品 varchar(30),

抱闸信号电缆_Z轴电缆工艺图 varchar(30) ,
抱闸信号电缆_Z轴数量 Integer ,
抱闸信号电缆_Z轴长度 varchar(10),
抱闸信号电缆_Z轴对接产品 varchar(30),

主轴1电缆_伺服总线电缆电缆工艺图 varchar(30) ,
主轴1电缆_伺服总线电缆数量 Integer ,
主轴1电缆_伺服总线电缆长度 varchar(10),
主轴1电缆_伺服总线电缆对接产品 varchar(30),

主轴1电缆_主轴动力电缆电缆工艺图 varchar(30) ,
主轴1电缆_主轴动力电缆数量 Integer ,
主轴1电缆_主轴动力电缆长度 varchar(10),
主轴1电缆_主轴动力电缆对接产品 varchar(30),

主轴1电缆_主轴反馈电缆电缆工艺图 varchar(30) ,
主轴1电缆_主轴反馈电缆数量 Integer ,
主轴1电缆_主轴反馈电缆长度 varchar(10),
主轴1电缆_主轴反馈电缆对接产品 varchar(30),

主轴1电缆_主轴电力电缆电缆工艺图 varchar(30) ,
主轴1电缆_主轴电力电缆数量 Integer ,
主轴1电缆_主轴电力电缆长度 varchar(10),
主轴1电缆_主轴电力电缆对接产品 varchar(30),

主轴1电缆_风机电缆电缆工艺图 varchar(30) ,
主轴1电缆_风机电缆数量 Integer ,
主轴1电缆_风机电缆长度 varchar(10),
主轴1电缆_风机电缆对接产品 varchar(30),

主轴1电缆_制动电阻电缆电缆工艺图 varchar(30) ,
主轴1电缆_制动电阻电缆数量 Integer ,
主轴1电缆_制动电阻电缆长度 varchar(10),
主轴1电缆_制动电阻电缆对接产品 varchar(30),

主轴1电缆_主轴编码器电缆电缆工艺图 varchar(30) ,
主轴1电缆_主轴编码器电缆数量 Integer ,
主轴1电缆_主轴编码器电缆长度 varchar(10),
主轴1电缆_主轴编码器电缆对接产品 varchar(30),
)

KNN

近朱者赤近墨者黑,分类或者回归算法。

n_neighbors:找最近的n个邻居,然后根据n个邻居判断它为什么。在机器学习库中,默认为5.

weights:默认是uniform, 参数可以是uniform、distance, 也可以是用户自己定义的函数

  • uniform: 是均等的权重, 就说所有的邻近点的权重都是相等的
  • distance: 是不均等的权重, 距离近的点比距离远的点的影响大
  • 用户自定义的函数, 接收距离的数组, 返回一组维数相同的权重

leaf_size: 默认是30, 这个是构造的kd树和ball树的大小. 这个值的设置会影响树构建的速度和搜索速度, 同样也影响着存储树所需的内存大小. 需要根据问题的性质选择最优的大小

p : minkowski距离度量里的参数. p=2时是欧氏距离, p=1时是曼哈顿距离,对于任意p, 就是minkowski距离

注:欧式距离为两个点的实际距离;曼哈顿距离为出租车距离,即遵守正南正北、正东正西方向规则;马氏距离:概率论距离,即基于样本分布距离。

image-20230308120004396

随机森林

image-20230308120217890

image-20230308120314259

n_estimators:树的个数(学习器的个数),提高数值,提高模型准确率,但是训练时间变长

image-20230308120807856

max_depth:树的最大深度

image-20230308120934344

image-20230308120956257

决策树

超参数介绍参考随机森林

SVC

kernel:核函数

C:惩罚参数

  • 错误项的惩罚系数。
  • c越大,即对分错样本的惩罚程度越大,因此在训练样本中准确率越高,但是泛化能力降低,也就是对测试数据的分类准确率降低。
  • 相反,减小c的话,允许训练样本中有一些误分类错误样本,泛化能力强。
  • 对于训练样本带有噪声的情况,一般采用减小c的方法,把训练样本集中错误分类的样本作为噪声2.

AdaBoost

n_estimators:为弱学习器的数量‘

learning_rate:为弱学习器的权重缩减系数。

打印进程地址转换过程

实验目的

  • 深入理解操作系统的段、页式内存管理,深入理解段表、页表、逻辑地址、线性地址、物理地址等概念;
  • 实践段、页式内存管理的地址映射过程;
  • 编程打印特定进程地址转换过程。

知识储备

线性地址和物理地址之间的变换

image-20220613200700988

页目录和页表的表项格式

image-20220613200727069

主内存区域

image-20220613200748502

进程代码和数据在其逻辑地址空间中的分布

image-20220613200817319

实验过程

修改sys.h

把debug_paging函数声明为全局变量,添加中断函数表。

image-20220613201246999

修改系统调用函数

把对应的函数个数进行修改

image-20220613201325695

增加系统调用号

需要在unistd.h 中修改,注意进行挂载。

运行 sudo ./mount-hdc 可以把虚拟机硬盘挂载在 oslab/hdc 目录下。
hdc/usr/include 目录下修改 unistd.h

image-20220613201526522

新增debug_paging.c文件

将完成的文件放入linux-0.01/kernel 目录下

image-20220613204253402

修改makefile

image-20220613201730179

编写test.c

image-20220613201838239

实现fprintk

image-20220613202027276

实验结果

image-20220613203314373

image-20220613203534624

image-20220613203427810

问题回答

  • 页表中正在使用的页表项是连续的吗?这体现了分页的什么优点?
1
不是。可以充分利用碎片的内存空间,提高空间利用率。
  • 你觉的分段是必要的吗?现在的 Linux (x86-64) 是怎么处理分段的?
1
不是。在64位模式下:处理器把CS/DS/ES/SS的段基都当作0,忽略与之关联的段描述符中的段基地址。因为在64位模式中,CPU可以访问所有可寻址的内存空间。x86工作在保护模式下时,分段单元将逻辑地址转换成线性地址,分页单元(MMU开启情况下)将线性地址转换成物理地址。当CPU启用了MMU,CPU核发出的地址将被MMU截获,从CPU到MMU的地址称为虚拟地址,而MMU将这个地址翻译成另一个地址发到CPU芯片的外部地址引脚上,也就是将虚拟地址映射成物理地址,在x86_64上,处理器把CS/DS/ES/SS的段基都当作0,实际上摒弃了段式管理,不再使用。指令中使用的地址就是线性地址,当CPU开启MMU时,通过页式管理单元翻译成物理地址。

地址映射与共享

实验内容

  • Bochs 调试工具跟踪 Linux 0.11 的地址翻译(地址映射)过程,了解 IA-32Linux 0.11 的内存管理机制;
  • Ubuntu 上编写多进程的生产者-消费者程序,用共享内存做缓冲区;
  • 在信号量实验的基础上,为 Linux 0.11 增加共享内存功能,并将生产者-消费者程序移植到 Linux 0.11

实验步骤

创建test.c

image-20220612154248888

image-20220612154259966

寻找物理地址

首先进入Linux-0.11目录内make编译系统,然后运行系统,编译运行test.c文件

1
2
gcc -o test test.c
./test

image-20220612154459443

此时会进入在test.c内的while死循环,然后ctrl+c暂停bochs。
此时需要让Linux-0.11的test跳出死循环,所以需要找到逻辑地址ds:0X00003004对应的物理地址,将它的内容更改为0。
在终端中输入sreg,得到gdtr的基址值为0x00005cb8,ldtr为0x0068即0000 0000 0110 1000 b,可知索引为1101b即13,TI位为0,即GDT中的第13项为LDT的段描述符。

image-20220612162319691

输入

1
xp /2w 0x00005cb8+13*8

image-20220612162954016

可以得到LDT的基址为0x00fe92d0

ds段选择子为0x0017 => 0000 0000 0001 0111 b,可知索引为10b即2,TI位为1,即LDT中的第2项为ds的段描述符

输入

1
xp/2w 0x00fe92d0+2*8

得到ds段描述符

image-20220612163210299

可以知道ds的基址为0x10000000,所以0x3004对应的线性地址为0x10000000+0x3004=0x10003004

输入

1
xp /w 64*4

获取页目录项

image-20220612164505087

表所在的物理页框号为0x00fa7,即页表在物理内存为0x00fa7000处,从该位置开始查找3号页表项

输入

1
xp /w 0x00fa7000 + 3*4

image-20220612164837721

线性地址0x10003004对应的物理页框号为0x00fa6,和页内偏移0x004接到一起,得到0x00fa6004,这就是变量i的物理地址

1
xp /w 0x00fa6004

验证

image-20220612165035955

修改物理地址,使其变量i为0

1
setpmem 0x00fa6004 4 0

image-20220612165143590

输入c,可以看到,会在bochs中顺利退出

image-20220612165212346

添加系统调用

在unistd.h中增加下面的代码

image-20220612155524270

再添加系统调用

image-20220612155644251

注意:要在挂载下再修改一次

修改sys.h文件

增加函数声明

image-20220612155826510

image-20220612155924786

在system_call.s中把nr_system_calls改为78

image-20220612165738290

增加shm.c

在kernel目录下

image-20220612165927254

然后修改kernel下的Makefile

image-20220612170053415

编写消费者和生产者程序

producer.c

image-20220612203642964

consumer.c

image-20220612203703637

运行验证

编译

1
2
gcc -o pro producer.c
gcc -o con consumer.c

image-20220612202823323

输入

1
2
pro > proOutput &
con > conOutput &

image-20220612202905073

image-20220612203010281

输入

1
sync

关闭linux-0.11回到ubunt终端,输入sudo less hdc/usr/root/conOutput查看结果如下

image-20220612203138227

问题回答

对于地址映射实验部分(第一部分),列出你认为最重要的几步(不超过四步),并给出你获得的实际数据。

1
2
3
4
输入命令u/7反汇编,查看变量i对应的逻辑地址
逻辑地址找虚拟地址要通过段表,也就是IDT表,然后IDT表要根据LDTR寄存器和GDT表,对应的命令就是sreg
根据ds(代码段)寄存器查找IDT表,得到基址,然后通过基址 + 逻辑地址 = 虚拟地址
根据虚拟地址找到物理地址,核心就是查找页表

image-20220612154459443

image-20220612162319691

image-20220612162954016

image-20220612163210299

image-20220612164505087

image-20220612164837721

test.c退出后,如果马上再运行一次程序,并再进行地址跟踪,你会发现哪些异同?为什么?

1
2
再运行一次程序,等同于重来,变量i重新被赋非0值,所以仍然会死循环。
继续进行地址跟踪,根据虚拟地址找到物理地址,发现物理地址和第一次运行时的不一样了,因为在这个进程没有被运行时,内存是会被释放的,所以其他进程是可以利用这个内存的,虽然还是这个虚拟地址,但是重新分配内存的时候,物理地址并不一定还是那个地址。

六级作文共分为现象解释类,谚语类,图画类,观点选择类,问题解决类,所有类别只有第一段书写不同。

第一段

现象解释类

image-20220607220842008

图表类

image-20220607220921980

谚语类

image-20220607220945787

观点选择

低级版本:

image-20220607221025117

高级版本:

image-20220607221040330

问题解决

image-20220607221107224

第二段

image-20220607220727437

image-20220607220736545

image-20220607220800935

第三段

image-20220607220811838

信号量的实现与应用

知识储备

在消费者与生产者实现时,需要进行文件读写,实验指导书中提到,可通过借助标准C库函数来实现,或者直接通过对应的系统调用。

image-20220526193310932

这里列出关于文件读写的三个函数说明

fseek()

C 库函数 int fseek(FILE *stream, long int offset, int whence) 设置流 stream 的文件位置为给定的偏移 offset,参数 offset 意味着从给定的 whence 位置查找的字节数。

声明如下

1
2
int fseek(FILE *stream, long int offset, int whence)
如fseek( fp, 5, SEEK_SET )就是把文件指针fp移动到距离文件开头5个字节处。

参数:

1
2
3
stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了流。
offset -- 这是相对 whence 的偏移量,以字节为单位。
whence -- 这是表示开始添加偏移 offset 的位置。它一般指定为下列常量之一:
常量 描述
SEEK_SET 文件的开头
SEEK_CUR 文件指针的当前位置
SEEK_END 文件的末尾

返回值:如果成功,则该函数返回0,否则返回非零值。

fread()

C 库函数 size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream) 从给定流 stream 读取数据到 ptr 所指向的数组中。

声明如下

1
2
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
如fread(&productid,sizeof(int),1,fp) 就是从fp指向的文件中,读取一个int长度的元素

参数

1
2
3
4
ptr -- 这是指向带有最小尺寸 size*nmemb 字节的内存块的指针。
size -- 这是要读取的每个元素的大小,以字节为单位。
nmemb -- 这是元素的个数,每个元素的大小为 size 字节。
stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输入流

返回值:成功读取的元素总数会以 size_t 对象返回,size_t 对象是一个整型数据类型。如果总数与 nmemb 参数不同,则可能发生了一个错误或者到达了文件末尾。

fwrite()

C 库函数 size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)ptr 所指向的数组中的数据写入到给定流 stream 中。

声明如下

1
2
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
如fwrite(&Outpos,sizeof(int),1,fp)是向fp指向的文件中写入1个int长度的Outpos变量中的内容

参数

1
2
3
4
ptr -- 这是指向要被写入的元素数组的指针。
size -- 这是要被写入的每个元素的大小,以字节为单位。
nmemb -- 这是元素的个数,每个元素的大小为 size 字节。
stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输出流。

返回值:如果成功,该函数返回一个 size_t 对象,表示元素的总数,该对象是一个整型数据类型。如果该数字与 nmemb 参数不同,则会显示一个错误。

步骤

实现信号量

新建sem头文件sem.h

在linux-0.11/include/linux目录下新建sem.h,定义信号量的数据结构。

image-20220612134551189

sem.c

在linux-0.11/kernel目录下,新建实现信号量函数的源代码文件sem.c。

image-20220612134734941

修改unistd.h

在其中增加对于信号量的系统调用编号,类似于之前的操作

image-20220612135224839

修改system_call.s

因为增加了四个sem系统调用函数,在system_call.s文件中找到nr_system_calls并将其值更改为76

image-20220612135344070

修改sys.h

image-20220612140948110

image-20220612141013642

修改Makefile

image-20220612141105182

image-20220612141116701

准备文件

在oslab根目录下执行

1
sudo ./mount-hdc

使用cp命令将unistd.h复制到usr/include下,将sem.h复制到usr/include/linux下

编写程序

新建pc.c

image-20220612141444002

进行挂载,再,利用cp命令将其移动到usr/root目录下

编译

运行linux-0.11之后,首先编译pc.c,使用命令

1
gcc -o pc pc.c

随后运行pc,使用命令

1
./pc > sem_output

最终在虚拟环境内输入

1
sync

把修改的数据写入磁盘。

查看sem_output

首先挂载hdc,然后进入usr/root目录并在终端内执行

1
sudo less sem_output

命令,可看到下图结果:

image-20220612141711137

问题回答

如果去掉所有与信号量有关的代码,编译运行程序之后可以发现输出的数字顺序完全混乱。
信号量不存在的情况下,进程之间无法同步或者协作,造成此种情况的有如下原因:

1
2
3
- 一种情况是缓冲区满了,生产者还在写入数据,会造覆盖掉部分数据。
- 一种是缓冲区为空,消费者尝试读取数据,读到的数据是已输出的数据。
- 多个进程对文件缓冲区同时访问,造成了程序崩溃。

进程运行轨迹的跟踪与统计

实验步骤

1.修改init/main.c文件。

由于新改版的实验环境,打印进程 0 的相关内容会产生bug,可能是虚拟机或是其他原因引起的。 因此,后续所有的打印输出都是从进程 1 开始,所以对于init/main.c文件,将在进程1的关联代码后边补充打开log文件的代码。

修改如下:

image-20220525233305349

如果要是按照之前版本进行修改,则进入linux0.11后,会一直在task[0]进行空转,血的教训,浪费了半天时间。

2.在 kernel/printk.c 中增加写文件函数fprintk() 。

这个使用实验指导书给出的即可。注意对于

image-20220524234054542

需要进行修改。

若是不进行修改,则程序可进行,但是无法写入process.log,又一个不好好看指导书的教训。

3.在进程的状态改变时,向log文件中写入记录。

由于进程的状态会在它创建、调度和销毁的时候发生改变,所以需要修改这三个过程对应的内核文件fork.c 、sched.c 和 exit.c ,在其中控制进程状态改变的代码后面加上一段向log文件写入记录的代码。

3.1 修改fork.c

真正实现进程创建的函数是 copy_process(),它定义在 kernel/fork.c 中,以下的一段代码设置了指向结构体变量的指针p的一系列属性之后,把start_time置成了jiffies,即相当于完成了进程的创建,所以在这行代码之后加上一条写log的代码,就可以记录进程新建的时刻。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
p = (struct task_struct *) get_free_page();
if (!p)
return -EAGAIN;
task[nr] = p;
*p = *current; /* NOTE! this doesn't copy the supervisor stack */
p->state = TASK_UNINTERRUPTIBLE;
p->pid = last_pid;
p->father = current->pid;
p->counter = p->priority;
p->signal = 0;
p->alarm = 0;
p->leader = 0; /* process leadership doesn't inherit */
p->utime = p->stime = 0;
p->cutime = p->cstime = 0;
p->start_time = jiffies;

修改这两处地方

image-20220524234424811

image-20220524234436584

3.2 修改kernel/sched.c

以下的修改的原理类似,即在进程状态改变的时候添加fprintk()指令写log文件。

3.2.1修改schedule()

对原始代码新增fprintk后如下,实验中给出了提示:schedule() 找到的 next 进程是接下来要运行的进程(注意,一定要分析清楚 next 是什么)。如果 next 恰好是当前正处于运行态的进程,swith_to(next) 也会被调用。这种情况下相当于当前进程的状态没变。

image-20220524234613727

image-20220524234623625

3.2.2修改sys_pause()

系统无事可做的时候,进程 0 会不停地调用 sys_pause(),以激活调度算法。此时它的状态可以是等待态,等待有其它可运行的进程;也可以叫运行态,因为它是唯一一个在 CPU 上运行的进程,只不过运行的效果是等待。

image-20220524234648246

3.2.3修改sleep_on()

image-20220524234713922

3.2.4修改interruptible_sleep_on()

image-20220524234737161

3.2.5修改wake_up()

image-20220524234753974

3.3修改kernel/exit.c

3.3.1修改do_exit

image-20220524234908049

3.3.2修改sys_waitpid

image-20220524234925762

4.最终编写一个process.c程序,用它创建多个进程来进行测试。

该文件的目的是创建几个进程用来测试,注意用到fork()和wait()两个函数。

fork()函数,简单说该函数的作用就是创建一个子进程,开辟一条与父进程平行的时间线,即创建了一个分叉路口。在调用fork的时候就产生这个分叉路口了,fork之前与之后的代码都会被分岔路口之后的父进程和子进程执行。

fork它在父进程和子进程里的返回值是不同的:父进程中返回子进程的ID,子进程中返回0(。 那么如果我想让一条语句在子进程中执行而不在父进程中执行,那么就可以判断fork()的返回值是不是等于0,如果等于0就执行这条语句。

wait()函数,当调用该函数时(如果没有参数),意思就是判断当前进程的子进程有没有结束,如果有任意一个子进程结束了,那么当前进程就可以结束了,否则就处于阻塞状态;如果当前进程已经没有子进程了,那么就不会发生什么事,不会阻塞,只是wait的返回值发生变化。也就是说,如果当前进程有三个子进程,如果我要让这三个子进程先结束,让当前进程最后结束,那么就连用三个wait(),才能确保当前进程在三个子进程都结束后再结束。

:关于这部分知识可参考CSAPP,有详细介绍过。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <sys/times.h>
#include <sys/wait.h>
#include <sys/types.h>
#define HZ 100

void cpuio_bound(int last, int cpu_time, int io_time);

int main(int argc, char * argv[])
{
pid_t Pid1;
pid_t Pid2;
pid_t Pid3;

Pid1 = fork();
if (Pid1 < 0) printf("error in fork!");
else if (Pid1 == 0)
{
printf("child process 1:\n");
cpuio_bound(5, 2, 2);
}

Pid2 = fork();
if (Pid2 < 0) printf("error in fork!");
else if (Pid2 == 0)
{
printf("child process 2:\n");
cpuio_bound(5, 4, 0);
}

Pid3 = fork();
if (Pid3 < 0) printf("error in fork!");
else if (Pid3 == 0)
{
printf("child process 3:\n");
cpuio_bound(5, 0, 4);
}

printf("This process's Pid is %d\n", getpid());
printf("Pid of child process 1 is %d\n", Pid1);
printf("Pid of child process 2 is %d\n", Pid2);
printf("Pid of child process 3 is %d\n", Pid3);
wait(NULL);
wait(NULL);
wait(NULL);
return 0;
}

/*
* 此函数按照参数占用CPU和I/O时间
* last: 函数实际占用CPU和I/O的总时间,必须>=0,同时不含在就绪队列中的时间
* cpu_time: 一次连续占用CPU的时间,必须>=0
* io_time: 一次I/O消耗的时间,必须>=0
* 如果last > cpu_time + io_time,则往复多次占用CPU和I/O
*/
void cpuio_bound(int last, int cpu_time, int io_time)
{
struct tms start_time, current_time;
clock_t utime, stime;
int sleep_time;

while (last > 0)
{
/* CPU Burst */
times(&start_time);
/* 其实只有t.tms_utime才是真正的CPU时间。但由于模拟的是一个
* 只在用户状态运行的CPU大户,就像“for(;;);”。所以把t.tms_stime
* 加上很合理。*/
do
{
times(&current_time);
utime = current_time.tms_utime - start_time.tms_utime;
stime = current_time.tms_stime - start_time.tms_stime;
} while ( ( (utime + stime) / HZ ) < cpu_time );
last -= cpu_time;

if (last <= 0 )
break;

/* IO Burst */
/* 用sleep(1)模拟1秒钟的I/O操作 */
sleep_time=0;
while (sleep_time < io_time)
{
sleep(1);
sleep_time++;
}
last -= sleep_time;
}
}

5.测试

1
2
3
4
5
sudo ./mount-hdc
cp ./process.c ./hdc/usr/root/
./run
gcc -o process process.c
./process

image-20220525122913097

运行sync指令进行同步,将缓冲区信息加载到硬盘。然后关闭模拟器,再次挂载hdc后,进入查看hdc/var/process.log。

1
sync

image-20220524235601959

1
2
3
cp ./hdc/var/process.log ./
sudo chmod +x ./stat_log.py
./stat_log.py process.log 7 8 9 10 11 12 13 14 -g

image-20220525232721464

:由于修改了实验环境,所以从进程一开始打印,所以对应的stat_log.py也需要修改,主要修改如下

image-20220525232924032

在这里额外补充进程1的新建和运行。

因为对于本次实验,我们是在进程1运行后才开始写入的,所以没有进程0与进程1的创建,而我们对应的py程序又会将其检测为一个error,报nonew的异常,所以需要手动补充。

修改时间片

nux0.11采用的调度算法是一种综合考虑进程优先级并能动态反馈调整时间片的轮转调度算法。 它为每个进程分配一个时间段,称作它的时间片,即该进程允许运行的时间。如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程;如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。调度程序所要做的就是维护一张就绪进程列表,当进程用完它的时间片后,它被移到队列的末尾。

综合考虑进程优先级:一个进程在阻塞队列中停留的时间越长,它的优先级就越大,下次就会被分配更大的时间片。

进程之间的切换是需要时间的,如果时间片设定得太小的话,就会发生频繁的进程切换,因此会浪费大量时间在进程切换上,影响效率;如果时间片设定得足够大的话,就不会浪费时间在进程切换上,利用率会更高,但是用户交互性会受到影响,在这里老师上课讲的银行的例子就可以拿过来。

时间片的初始值是进程0的priority,是在linux-0.11/include/linux/sched.h的宏 INIT_TASK 中定义的,如下:我们只需要修改宏中的第三个值即可,该值即时间片的初始值

1
2
3
#define INIT_TASK \
{ 0,15,15,
// 上述三个值分别对应 state、counter 和 priority;

我修改了三个值,结果分别如下

其中Average值发生了变化,throughout变化为小数点后发生的变化。

当时间片为10时:

image-20220525234224119

当时间片为15时:

image-20220525234651300

当时间片为20时:

image-20220525234458649

问题回答

问题1:单进程编程和多进程编程的区别?

1
2
3
4
5
6
7
1.执行方式:单进程编程是一个进程从上到下顺序进行;多进程编程可以通过并发执行,即多个进程之间交替执行,如某一个进程正在I/O输入输出而不占用CPU时,可以让CPU去执行另外一个进程,这需要采取某种调度算法。

2.数据是否同步:单进程的数据是同步的,因为单进程只有一个进程,在进程中改变数据的话,是会影响这个进程的;多进程的数据是异步的,因为子进程数据是父进程数据在内存另一个位置的拷贝,因此改变其中一个进程的数据,是不会影响到另一个进程的。

3.CPU利用率:单进程编程的CPU利用率低,因为单进程在等待I/O时,CPU是空闲的;多进程编程的CPU利用率高,因为当某一进程等待I/O时,CPU会去执行另一个进程,因此CPU的利用率高。

4.多进程用途更广泛。

问题2:你是如何修改时间片的?仅针对样本程序建立的进程,在修改时间片前后, log 文件的统计结果(不包括Graphic)都是什么样?结合你的修改分析一下为什么会这样变化,或者为什么没变化?

1
2
3
将时间片变小,进程调度次数变多,系统会使得该进程等待时间变长。
将时间片增大,进程因中断/睡眠而产生的调度次数也增多,等待时间也会变长。
总结:时间片要设置合理,不能过大或者过小。

系统调用

知识储备

应用程序如何调用系统调用

在通常情况下,调用系统调用和调用一个普通的自定义函数在代码上并没有什么区别,但调用后发生的事情有很大不同。

调用自定义函数是通过 call 指令直接跳转到该函数的地址,继续运行。

而调用系统调用,是调用系统库中为该系统调用编写的一个接口函数,叫 API(Application Programming Interface)。API 并不能完成系统调用的真正功能,它要做的是去调用真正的系统调用,过程是:

把系统调用的编号存入 EAX;
把函数参数存入其它通用寄存器;
触发 0x80 号中断(int 0x80)。
linux-0.11 的 lib 目录下有一些已经实现的 API。Linus 编写它们的原因是在内核加载完毕后,会切换到用户模式下,做一些初始化工作,然后启动 shell。而用户模式下的很多工作需要依赖一些系统调用才能完成,因此在内核中实现了这些系统调用的 API。
为什么要有内核态和用户态两种状态?

因为有些操作很危险,比如清空内存,I/O等,不能随便一个程序就能进行这样的操作。所以区分出内核态与用户态,用户态可以执行一些不危险的操作,当需要执行危险操作时,需要通过系统调用等方法进入内核态执行。

实验过程

1.修改linux-0.11/include/linux/sys.h

需要把 iam()whoami() 两个函数声明为全局变量,并添加到中断函数表中,当中断被调用的时候,先查找中断向量表,找到相应的函数名,调用其函数。

image-20220523192718134

2.修改系统调用数

system_call.slinux-0.11/kernel
需要把nr_system_calls 由72改为 74 表示了中断函数的个数。

image-20220523192844373

3.新增系统调用号

需要在unistd.h 中修改,但是实验后发现行不通,查阅后发现需要在linux系统中修改。

运行 sudo ./mount-hdc 可以把虚拟机硬盘挂载在 oslab/hdc 目录下。
hdc/usr/include 目录下修改 unistd.h

image-20220523193158462

4.新增 who.c 文件,实现系统调用的函数

将完成的who.c文件放入linux-0.01/kernel 目录下

image-20220523210811801

image-20220523210825948

5.修改makefile

共有两处

image-20220523193418730

image-20220523193435486

6.新增 iam.c 和 whoami.c 文件以测试系统调用是否添加成功

iam.c

image-20220523193643654

whoami.c

image-20220523193550834

同理需要在linux0.11下编译

1
2
3
sudo ./mount-hdc 
cp ./iam.c hdc/usr/root
cp ./whoami.c hdc/usr/root

然后./run

7.编译 iam.c 跟 whoami.c

1
2
gcc -o iam iam.c 
gcc -o whoami whoami.c

image-20220523203159191

实验结果

image-20220523192418659

以及两个测试结果

image-20220523193847193

image-20220523193923766

问题回答

一、

  • Linux 0.11 现在的机制看,它的系统调用最多能传递几个参数?
1
Linux-0.11的系统调用通过寄存器ebx、ecx、edx传递参数,最多能传递3个参数。

二、

  • 你能想出办法来扩大这个限制吗?
1
2
3
4
1.增加传参所用的寄存器
2.通过定义结构体,在结构体中存入很多参数,然而只把结构体入口地址作为参数进行传递;
3.或者就利用这三个寄存器,重复传值
4.或者将寄存器进行拆分,根据需要不同位传值

三、

  • 用文字简要描述向 Linux 0.11 添加一个系统调用 foo() 的步骤。
1
2
3
4
5
1.在include/unistd.h中定义宏__NR_foo,并添加供用户调用的函数声明void foo();
2.修改kernel/system_call.s中的nr_system_calls,使其增加1;
3.在include/linux/sys.h中添加函数声明extern void sys_foo(),在系统调用入口表fn_ptr末端添加元素sys_foo;
4.添加kernel/foo.c文件,实现sys_foo()函数;
5.修改kernel/Makefile,在OBJS中加入foo.o,并添加生成foo.s、foo.o的依赖规则。

问题

记录一个只有自己遇到的问题,当我对于Linux0.11文件进行make时,发现会报错,具体错误如下,

image-20220523205611785

当我调试后发现,问题出自linux/kernel/chr_drv处

当我用一个新的该文件,只在chr_drv下make时,会出现

image-20220523205822630

于是我make clean,再进行make,会出现下面的错误make

image-20220523205901514

这两个问题分别对应于上面提到的那两个问题。

目前我没有找出这个问题的原因,我所采用的解决办法是,在其他机子上先对chr_drv文件进行编译,然后进行替换,则可以解决问题。困惑…

DBMS考点

对的要求再复习一次

域再看一下,函数依赖再看一下,关系模式分解

1-3部分:选择,填空,查询 30

4-6部分:选择,填空,证明,设计 35

7-12部分:选择,填空,算法,分析 35

考前看的

image-20220520205944497

image-20220520205958323

image-20220520212508933

image-20220520224447692

第一章

数据库:有组织的、共享的、持久存储的数据集合。

数据库管理系统image-20220520153555464

数据库用户image-20220520153623316

数据库系统:由数据库、数据库管理系统、应用程序和数据库用户在一起构成的系统。

数据库语言:数据定义语言;数据操作语言

数据模型image-20220520153847947

数据库模式image-20220520154032246

数据库实例image-20220520154059712

数据库三层模式结构:数据库模式通常分三个层次定义,从低到高分别是:内模式/存储模式;概念模式;外模式/视图

内模式/存储模式:描述数据库的物理存储结构和存取方式;数据库只有一个内模式;定义内模式时通常使用物理数据模型提供的概念

概念模式:为全体数据库用户描述整个数据库的结构和约束;数据库只有一个概念模式;定义概念模式时使用实现数据模型提供的概念

外模式/视图:从不同类别用户的视角描述数据库结构;可以有多个外模式;定义外模式时也可以使用实现数据模型提供的概念

数据独立性:逻辑数据独立性;物理数据独立性

image-20220520154405650

第二章

关系模型

超键:可以唯一标识每个元组的属性。

候选键:任意真子集都不是超键的超键。即极小的超键。

image-20220520155141463

主属性:候选键中的属性。

关系完整性约束

完整性约束的类型:实体完整性、参照完整性、用户定义完整性。

实体完整性约束规则

1
主键值唯一且非空。

参照完整性约束

1
对于外键的约束,外键值为空或不为空则必须在S存在。

用户定义完整性约束

1
根据需求定义。

关系代数

投影image-20220520155612344

并、差、交image-20220520155641699

重命名image-20220520155743424

$\theta$连接image-20220520155859015

等值连接:连接条件仅涉及相等比较的连接称作等值连接。

image-20220520160538221

分组操作image-20220520160612769

关系演算

image-20220520160959188

image-20220520161142076

第三章

非嵌套查询

image-20220520161425477

image-20220520161503774

注意:空值判断,应用 is null,不可以用 =或者!=

查询结果排序image-20220520161558258

聚集查询image-20220520161649142

:聚集函数不能出现在where子句中

分组查询image-20220520161924541

image-20220520161945409

连接image-20220520162037491

嵌套查询

image-20220520162335425

使用exists关键字进行查询的时候,首先,我们先查询的不是子查询的内容,而是查我们的主查询的表,然后,根据表的每一条记录,依次去判断where后面的条件是否成立。

in在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比较小的时候,in的速度较快。

image-20220520162543845

更新数据库

image-20220520162635401

image-20220520162642179

image-20220520162649518

image-20220520162658892

视图

image-20220520162844795

image-20220520162906353

image-20220520162914871

image-20220520162930131

第四章

数据库设计的基本过程

image-20220520163234585

实体-联系模型

与实体相关的概念

实体:数据库中表示的现实世界中的具体对象或事物。

属性:用于刻画实体的特性。

属性的类型

1
2
3
4
简单属性
复合属性
多值属性
派生属性

image-20220520163910020

实体型的ER图表示

image-20220520163916662

弱实体型:没有键属性的实体型。

标识实体型、属主实体型:由于弱实体型没有键属性,需要依赖于其他实体型进行区分。

标识联系型:弱实体型与其标识实体型通过标识联系型关联。

部分键:用于区分和同一标识实体相关联的弱实体的属性集合。

image-20220520163925574

与联系相关的概念

联系:一个联系表示多个实体之间有意义的关联关系。

联系型:同一类联系共同具有的类型。

联系型的度:参与到一个联系型中的实体型的个数。

联系集:数据库中当前存储的联系型的实例的集合。

image-20220520163949288

基数比image-20220520164015974

参与度

image-20220520164105233

第五章

概念数据模型转换为关系数据库模型

实体型的转换

image-20220520164330211

复合属性的转换

image-20220520164401070

多值属性的转换

image-20220520164446039

弱实体型转换

image-20220520164516972

M:N二元联系型的转换

image-20220520164634209

N:1二元联系型的转换

image-20220520164726502

1:1二元联系型的转换

与N:1相同

函数依赖

定义

image-20220520164850113

平凡函数依赖image-20220520164953833

完全函数依赖image-20220520165020624

部分函数依赖image-20220520165056729

传递函数依赖image-20220520165125143

逻辑蕴含image-20220520165211147

image-20220520165702247

属性集闭包image-20220520165402241

等价函数依赖集image-20220520165508652

image-20220520165515069

范式

第一范式

若关系模式R的每个属性都是不可分的,则称R为第一范式关系模式。

问题原因:非主属性部分函数依赖于候选键

第二范式

image-20220520165753008

问题原因:非主属性传递函数依赖于候选键

第三范式

image-20220520165821598

问题原因:主属性部分依赖于候选键

BCNF

image-20220520165852993

消除主属性间的传递依赖。

判断方法

1
https://blog.csdn.net/weixin_43865875/article/details/115659734

关系模式分解

分解准则1:无损连接性

image-20220520170550893

分解准则2:函数依赖保持性

image-20220520170647628

无损连接性判定

image-20220520170717706

BCNF分解算法

image-20220520170838645

3NF分解算法

image-20220520170855147

第六章

索引设计

根据数据文件中的元组是否按索引键值排序,分为聚簇索引与非聚簇索引。

聚簇索引

文件中的元组按索引键排序的,则索引为聚簇索引。

1
2
聚簇索引的索引键通常为关系主键;
一个关系通常只有一个聚簇索引

非聚簇索引

文件中的元组不按索引键排序的,则索引为非聚簇索引。

1
一个关系上可以有多个非聚簇索引

根据索引键是否为关系的主键,可将有序索引分为两类:主索引,二级索引

主索引

1
索引键为主键;一个关系只有一个

二级索引

1
2
索引键不是主键:
通常为非聚簇索引,一个关系可以有多个

根据关系中每个元组在索引中是否都有一个对应索引项,可将有序索引分为两类:稠密索引、稀疏索引

image-20220520175937252

image-20220520175956860

image-20220520180242647

关系模式的优化

image-20220520180448573

image-20220520180514823

image-20220520180528762

第七章

存储介质

按CPU访问存储介质的方式,可将存储器分为三类。

1
2
3
主存储器
二级存储器
三级存储器

主存

1
2
包括:寄存器、高速缓存、内存
主存特点:按字节寻址、可使用load/store指令直接访问

二级存储器

1
2
包括:磁盘/机械硬盘、闪存/固态硬盘
特点:按块寻址、联机使用 CPU无法直接访问,需用read、write将数据先复制到主存

三级存储器

1
2
包括:磁带、光盘、网络存储
脱机使用、按块存储、需先将数据复制到二级存储

按存储介质的易失性/持久性,可分为

1
2
易失性存储器:计算机重启后,易失性存储器的数据会丢失
菲易失性存储器

image-20220520180639352

基于磁盘的数据库存储结构

元组表示

image-20220520180900446

image-20220520180909316

页布局

image-20220520180936480

image-20220520180943648

其余和原本内容一致,查看DBMS的文档。

第八章

可扩展哈希表

线性哈希表

B+树

第九章

image-20220520181353631

第十章

知识点总结

杂乱

消除左递归的方法

image-20220512192836269

image-20220512192935922

句柄

句柄:句型的最左直接短语

LL文法判断

1
2
3
4
5
当且仅当G的任意两个具有相同左部的产生式A → α | β 满足下面的条件:
不存在终结符a使得α 和β都能够推导出以a开头的串
α 和β至多有一个能推导出ε
如果 β ->* ε,则FIRST (α)∩FOLLOW(A) =Φ;
如果 α ->* ε,则FIRST (β)∩FOLLOW(A) =Φ;

LR四种文法的判断

1
关系:LR(0)<SLR(1)<LALR(1)<LR(1)

1.判断LR(0)文法:
看项目中是否有归约-归约和移进-归约冲突。
如果无冲突则是LR(0)文法(如果是LR(0)文法则四种都是);如果有冲突则不是LR(0)文法。(就要向下判断)

2.判断SLR(1)文法:
a:DFA中存在冲突项目(归约-归约,归约-移进)
b:{a1,a2,…,an},FOLLOW(B1),FOLLOW(B2)两两互不相交,(交集=空集)时是SLR(1)项目。
【也就是说,同时满足两个条件才是SLR(1)文法】

若不是再向下判断。

3.判断LR(1)文法:
构造带向前搜索符的DFA,无归约-归约冲突则是LR(1)文法。

【此处意思是如果有向前搜索符还有冲突的话就不是LR(1)文法,就要再向下判断】

4.判断LALR(1)文法:
合并同心集后无(归约-归约)冲突(在之前的基础上)
(核相同,向前搜索符不同)

(B->a,a
B->a,a|b
同心集)

LR即指LR(1)

四元式知识点

image-20220518170348404

image-20220518170539086

image-20220518170614471

一些函数

赋值语句的翻译

1
2
3
newtemp( ):生成一个新的临时变量t,返回t的地址
gen(code):生成三地址指令code
lookup(name):查询符号表返回name 对应的记录

数组引用的翻译

1
2
3
4
L的综合属性
L.type:L生成的数组元素的类型
L.offset:指示一个临时变量,该临时变量用于累加公式中的ij × wj项,从而计算数组元素的偏移量
L.array:数组名在符号表的入口地址

控制语句的翻译

1
2
3
4
继承属性
B.true:是一个地址,该地址用来存放当B为真时控制流转向的指令的标号
B.false:是一个地址,该地址用来存放当B为假时控制流转向的指令的标号
S.next:是一个地址,该地址用来存放紧跟在S代码之后执行的指令(S的后继指令)的标号

回填

非终结符B的综合属性

1
2
B.truelist:指向一个包含跳转指令的列表,这些指令最终获得的目标标号就是当B为真时控制流应该转向的指令的标号
B.falselist:指向一个包含跳转指令的列表,这些指令最终获得的目标标号就是当B为假时控制流应该转向的指令的标号

函数

1
2
3
4
5
6
makelist( i )
创建一个只包含i的列表,i是跳转指令的标号,函数返回指向新创建的列表的指针
merge( p1, p2 )
将 p1 和 p2 指向的列表进行合并,返回指向合并后的列表的指针
backpatch( p, i )
将 i 作为目标标号插入到 p所指列表中的各指令中
1
nextquad:即将生成的下一条指令的标号

优化方法

image-20220517011523873

NFA到DFA的转换

image-20220114100302890

image-20220114100719876

词法分析

词法分析阶段可检测错误的类型:

1
2
单词拼写错误
非法字符

语法分析

最左规约称为规范规约,而最右推导相应的称为规范推导。

LL错误恢复:恐慌模式

LR错误恢复:恐慌模式错误恢复;短语层次错误恢复

语法制导翻译

这两种情况下,SDT可在语法分析过程中实现

1
2
基本文法可以使用LR分析技术,且SDD是S属性的
基本文法可以使用LL分析技术,且SDD是L属性的

给定一个以LL文法为基础的L-SDD,可以修改这个文法,并在LR语法分析过程中计算这个新文法之上的SDD

1
2
3
4
5
6
给定一个以LL文法为基础的L-属性定义,可以修改这个文法,并在LR语法分析过程中计算这个新文法之上的SDD
首先构造SDT,在各个非终结符之前放置语义动作来计算它的继承属性, 并在产生式后端放置语义动作计算综合属性
对每个内嵌的语义动作,向文法中引入一个标记非终结符来替换它。每个这样的位置都有一个不同的标记,并且对于任意一个标记M都有一个产生式M→ε
如果标记非终结符M在某个产生式A→α{a}β中替换了语义动作a,对a进行修改得到a' ,并且将a'关联到M→ε 上。动作a'
(a) 将动作a需要的A或α中符号的任何属性作为M的继承属性进行复制
(b) 按照a中的方法计算各个属性,但是将计算得到的这些属性作为M的综合属性

中间代码生成

类型表达式

image-20220514095400390

控制流语句SDT编写要点

1
2
3
4
5
分析每一个非终结符之前
先计算继承属性
再观察代码结构图中该非终结符对应的方框顶部是否有导入箭头。如果有,调用label( )函数
上一个代码框执行完不顺序执行下一个代码框时,生成一条显式跳转指令
有自下而上的箭头时,设置begin属性。且定义后直接调用label( )函数绑定地址

运行存储分配

活动记录的一般形式

image-20220514194518053

静态存储分配

顺序分配法image-20220514195326335

层次分配法image-20220514195613542

栈式存储分配

活动树

调用序列与返回序列

image-20220514203627726

image-20220514203641791

image-20220514203739336

代码优化

如果表达式x op y先前已被计算过,并且从先前的计算到现在,x op y中变量的值没有改变,那么x op y的这次出现就称为公共子表达式

复制传播:在复制语句x = y之后尽可能地用y代替x

对于一个变量x ,如果存在一个正的或负的常数c使得每次x被赋值时它的值总增加c ,那么x就称为归纳变量

DAG

数组元素赋值image-20220515144738742

数据流分析

到达定值分析

正常

作用:

循环不变计算的检测

1
如果循环中含有赋值x=y+z ,而y和z所有可能的定值都在循环外面(包括y或z是常数的特殊情况) ,那么y+z就是循环不变计算

常量合并

1
如果对变量x的某次使用只有一个定值可以到达,并且该定值把一个常量赋给x ,那么可以简单地把x替换为该常量

ud链image-20220515160301603

活跃变量分析

活跃变量:对于变量x和程序点p,如果在流图中沿着从p开始的某条路径会引用变量x在p点的值,则称变量x在点p是活跃(live)的,否则称变量x在点p不活跃(dead)

逆向分析

用途:

删除无用赋值

1
无用赋值:如果x在点p的定值在基本块内所有后继点都不被引用,且x在基本块出口之后又是不活跃的,那么x在点p的定值就是无用的

为基本块分配寄存器

1
2
如果所有寄存器都被占用,并且还需要申请一个寄存器,则应该考虑使用已经存放了死亡值的寄存器,因为这个值不需要保存到内存
如果一个值在基本块结尾处是死的就不必在结尾处保存这个值

du链image-20220515173505087

可用表达式分析

概念:如果从流图的首节点到达程序点 p的每条路径都对表达式x op y进行计算,并且从最后一个这样的计算到点p之间没有再次对x或y定值,那么表达式x op y在点 p是可用的

初始化时出enter外每个out都是全集

用途:

消除全局公共子表达式

进行复制传播

代码生成

主要任务

1
2
3
指令选择
寄存器分配(allocation)和指派(assignment)
指令排序

题目总结

词素分析

符号表

image-20220519095250393

递归的预测分析

image-20220519090315865

非递归的预测分析

设计SDD

image-20220519090831495

image-20220519090857805

改写SDT

image-20220519091009554

image-20220519091020128

递归的翻译

image-20220519091117371

image-20220519091125843

image-20220519091136618

非递归的翻译

活动记录

image-20220519095215951

嵌套深度

找自然循坏

全局优化

image-20220519112045378

image-20220519112057244

image-20220519112108281

句柄

image-20220519090345663

注释语法分析树

image-20220519090524677

翻译赋值语句

image-20220519091438811

控制流翻译

image-20220519091926010

image-20220519091945017

四元式序列

image-20220519091908986

翻译方案

image-20220519093013272

13.5 难

13.6

image-20220519093318108

image-20220519093414326

14.4

image-20220519094046078

image-20220519094815904

求trulist

image-20220519093827461

活动树

image-20220519095147977

DAG

image-20220519095524644

数值分析

image-20220519095710086

image-20220519095720862