Taogen's Blog

Stay hungry stay foolish.

Background

I want to use Swagger with Spring Boot, but the Swagger-UI can’t work. Following it’s my code.

pom.xml

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
</parent>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
</dependencies>

AppConfig.java

@Configuration
@EnableSwagger2
public class SpringFoxConfig
{
@Bean
public Docket api()
{
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any())
.build();
}
}

Error Info

When I visited http://localhost:8080/swagger-ui.html, occur following error tips.

Solution

make sure your swagger configuration is under your spring boot application which can be scanned.
and then it solved.

Reason

My config file doesn’t scan by spring boot. It leads to the required bean is not exist.

References

https://github.com/springfox/springfox/issues/1996

Background

I use mvn spring-boot:run command to run my spring boot project.

Error Info

[ERROR] No plugin found for prefix 'spring-boot' in the current project and in the plugin groups [org.apache.maven.plugins, org.codehaus.mojo] available from the repositories [local (D:\Repositories\mavenRepo), central (https://
repo.maven.apache.org/maven2)] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/NoPluginFoundForPrefixException

Solution

Make sure your project pom.xml exists in your terminal’s working directory when you run the mvn spring-boot:run command. The basic configurations for the pom.xml file to run a spring boot project are shown below.

pom.xml

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
</parent>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>

<build>
<plugins>
<!-- run $ mvn package, generating an executable jar -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

Reason

I run the mvn spring-boot:run command not in my project root directory.

Reference

https://stackoverflow.com/questions/30855864/maven-no-plugin-found-for-prefix-spring-boot-in-the-current-project-and-in-th

为了探究操作系统的工作原理。我们先要知道它是什么,它的作用,以及它的组成结构。然后我们解释为什么需要操作系统。最后,我们开始探究操作系统的工作原理,它是如何实现这些功能的。

什么是操作系统


操作系统的定义

操作系统是一个一直运行在计算机中的程序。它管理着计算机的硬件和软件资源,提供一些服务给计算机的程序。为了更好的理解操作系统,我们可以把它对比一个政府组织,它作用的与政府组织相类似。一个政府组织,它不是为了自己而运作,而是为了给百姓提供服务。操作系统它提供了一个环境,让程序可以在操作系统中运行。


操作系统的功能

  • 用户接口。如用户图形界面,终端等。
  • 程序的执行。
  • I/O 操作。
  • 文件系统操作
  • 通信。
  • 错误侦探。
  • 资源分配。如,为程序分配CPU、分配内存。

操作系统的结构

常见的操作系统结构如下。

  • 整体结构 (Monolithic Structure)。结构比较简单,没有清晰的层次和模块划分。这种结构,初期看起来会比较简单。由于耦合度较高,后期就比较难维护,以及容易出现安全问题。
  • 分层结构 (Layered Approach)。系统分为多个层,较低的层的提供一系列方法给较高的层调用。这是一种松耦合的结构,系统中某一个部分改变对其它部分没有很大的影响。另外,这种结构比较易于系统调试。
  • 微核心结构 (Microkernels)。把所有不必要的组件从内核中移除,作为用户层的软件去实现,把内核最小化。这样的结构易于系统扩展,添加新的系统服务不需要修改内核。
  • 组件化结构 (Modules)。内核包含一些核心的组件,其它系统服务模块可以通过动态加载来实现。

现代操作系统一般采用上面的某一种结构。但有的操作系统会采用混合多种不同的结构。大部分现代操作系统都采用一种组件化结构称为 Loadable Kernel Modules (LKMs)。

虽然每个系统的结构各不相同,但它提供的功能大致是相同的。如进程管理,文件管理,设备管理等功能是必要的。每个系统为了实现它要提供的功能,采用一个合适的结构就好。最重要的是把功能很好的实现,以及方便操作系统能够持续的维护和优化。

现代 Linux 系统内核结构采用组件化结构,如图


为什么需要操作系统

操作系统是连接硬件和用户软件的媒介。它对硬件资源进行管理,提供一个让用户软件可以运行的环境,以及给用户提供了用户图形接口(GUI)让用户可以方便使用硬件资源。没有操作系统提供的环境,我们就无法享受各种各样的应用软件带来的便利。


操作系统是如何工作的


操作系统的启动过程

当笔记本电脑按下开机键后,位于电脑主板上的固件 ROM 中的启动程序(Boot Loader)会运行,常见的启动程序有 BIOS 和 UEFI。启动程序会加载操作系统的启动程序,进而把整个操作系统加载到内存中并开始执行操作系统。然后安装驱动程序,创建初始化系统进程,启动必要的服务(如Web服务器,数据库等),最终出现系统登录的页面。


操作系统是如何为用户程序服务的?

操作系统启动成功后,就可以登录系统。用户可以根据自己的需要运行相应的程序,如浏览器,文本编辑器等。

一个程序的运行,需要把可执行文件加载到内存中,需要使用 CPU 去执行。然而,硬件资源(CPU,内存等)是被操作系统所管理的,为了安全和高效,用户程序不能直接使用硬件资源。

操作系统为用户程序提供了一系列的接口,通过调用对应的接口获取相应的服务和资源。这一系列接口称为系统调用 (System Call)接口。

常见的系统调用接口

  • 进程控制。创建子进程,获取进程属性,分配额外内存空间等等。
  • 文件管理。创建和删除文件,打开和关闭文件,读写文件等等。
  • 设备管理。请求连接设备,关闭设备,读写设备等等。

操作系统是如何管理硬件和软件资源的?

为了更高效的使用硬件资源,需要合理的管理和分配资源。操作系统负责给进程分配资源。关于 CPU 的分配,一般采用轮询调度算法(Round-Robin Scheduling),即每个进程依次被 CPU 执行一个小的时间片段。关于内存的分配,一般采用的是虚拟内存,它可以使进程的逻辑内存空间远大于实际的物理内存空间,从而能运行更多的程序,更大程度的使用计算机硬件资源。

除了管理硬件资源,操作系统还要管理软件资源。如何让进程同步,如何解决进程死锁,如何实现文件I/O 等等。由于篇幅原因,这里就不具体展开。以后会单独作为一篇文章去写。


结语

通过了解操作系统是什么,为什么需要操作系统,以及操作系统的工作原理。我们大致了解操作系统的内部结构和实现机制。想要了解更多操作系统相关内容,可以阅读我的参考内容。


References

[1] Silberschatz, A. Operating system concepts 10th [M]. 2018.

[2] Operating system - Wikipedia

写博客这件事,最早是上大学的时候,老师课堂上说让我们写博客,说写博客不仅能够加强对知识的理解,也有利于将来找工作。那时对计算机领域相关东西了解的很少,学得也少,对写博客这件事没什么想法,写博客这件事从脑海中一闪而过了。毕业之后,也常常有写博客的念头。但是,感觉自己没什么可写。或者缺少开始的勇气。

最近,对整个计算机领域技术进行了梳理,对计算机技术有了一个较深的理解。知道自己要学什么、要干什么。同时,学习了很多计算机基础的内容,如组成原理,操作系统和算法。原来看起来很高深、很复杂的算法和实现原理,当你理解了之后,再回头看也就没有那么难。克服对技术的恐惧心理。所以,写博客看起来也不是一件很难的事情了。于是,经过一番折腾把博客搭起来了。接下来就是,写博客了。相信,那也不是一件很难的事!


0%